From 4afdc0af0c2ad96ec5906d6d371e21addd39b1a4 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Wed, 29 Jan 2020 20:15:27 +0100 Subject: [PATCH] Fix Add-PnPFile throwing "Access Denied" error with existing folders Workaround a permission issue in Web.EnsureFolder() that throws an exception if the user doesn't have Full Control permissions on Web level. --- Commands/Files/AddFile.cs | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Commands/Files/AddFile.cs b/Commands/Files/AddFile.cs index 828a0fdba..f517434e9 100644 --- a/Commands/Files/AddFile.cs +++ b/Commands/Files/AddFile.cs @@ -129,9 +129,7 @@ protected override void ExecuteCmdlet() } } - SelectedWeb.EnsureProperty(w => w.ServerRelativeUrl); - - var folder = SelectedWeb.EnsureFolder(SelectedWeb.RootFolder, Folder); + var folder = GetFolder(); var fileUrl = UrlUtility.Combine(folder.ServerRelativeUrl, FileName); ContentType targetContentType = null; @@ -236,5 +234,31 @@ protected override void ExecuteCmdlet() ClientContext.ExecuteQueryRetry(); WriteObject(file); } + + private Folder GetFolder() + { + // First try to get the folder if it exists already. This avoids an Access Denied exception if the current user doesn't have Full Control access at Web level + SelectedWeb.EnsureProperty(w => w.ServerRelativeUrl); + var Url = UrlUtility.Combine(SelectedWeb.ServerRelativeUrl, Folder); + + Folder folder = null; + try + { +#if ONPREMISES + folder = SelectedWeb.GetFolderByServerRelativeUrl(Url); +#else + folder = SelectedWeb.GetFolderByServerRelativePath(ResourcePath.FromDecodedUrl(Url)); +#endif + folder.EnsureProperties(f => f.ServerRelativeUrl); + return folder; + } + catch (ServerException serverEx) when (serverEx.ServerErrorCode == -2147024894) + { + // If the folder doesn't exist, create it + folder = SelectedWeb.EnsureFolder(SelectedWeb.RootFolder, Folder); + folder.EnsureProperties(f => f.ServerRelativeUrl); + return folder; + } + } } }