I have a document libray with structure like given below: FolderA->Subfolder1->item1 Subfolder2-->item2 They have folder level permissions . now i want to create the same folder structure and permissions with different Folder Parent name for example:
Once we copy the folder structure should be FOLDER B-->Subfolder1->item1 Subfolder2-->item2
This is for sharepointonline CSOM powershell.
I was able to copy the folder structure but unable to get permissions is anything missing
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Taxonomy.dll"
Function Copy-SPOFolder([String]$SiteURL, [String]$SourceFolderURL, [String]$TargetFolderURL)
{
$Host.Runspace.ThreadOptions = "ReuseThread"
Try{
#Copy the Folder
$MoveCopyOpt = New-Object Microsoft.SharePoint.Client.MoveCopyOptions
[Microsoft.SharePoint.Client.MoveCopyUtil]::CopyFolder($ctx, $SourceFolderURL, $TargetFolderURL, $MoveCopyOpt)
$ctx.ExecuteQuery()
Write-host -f Green "Folder Copied Successfully!" }
Catch {
write-host -f Red "Error Copying the Folder!" $_.Exception.Message
}
}
function Connect-SPO()
{
param ([Parameter(Mandatory=$true,Position=1)][string]$Username,[Parameter(Mandatory=$true,Position=2)][string]$Url,[Parameter(Mandatory=$true,Position=3)]$AdminPassword)
$global:ctx=New-Object Microsoft.SharePoint.Client.ClientContext($Url)
$ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Username, $AdminPassword)
$ctx.Load($ctx.Web)
$ctx.ExecuteQuery()
}
#Function to Get Folder Permissions
Function Get-SPOFolderPermission([String]$SiteURL, [String]$FolderRelativeURL)
{
$Host.Runspace.ThreadOptions = "ReuseThread"
Try{
#Get the Folder
$Folder = $ctx.Web.GetFolderByServerRelativeUrl($FolderRelativeURL)
$ctx.Load($Folder)
$ctx.ExecuteQuery()
#Get permissions assigned to the Folder
$RoleAssignments = $Folder.ListItemAllFields.RoleAssignments
$ctx.Load($RoleAssignments)
$ctx.ExecuteQuery()
#Loop through each permission assigned and extract details
$PermissionCollection = @()
Foreach($RoleAssignment in $RoleAssignments)
{
$ctx.Load($RoleAssignment.Member)
$ctx.executeQuery()
#Get the User Type
$PermissionType = $RoleAssignment.Member.PrincipalType
#Get the Permission Levels assigned
$ctx.Load($RoleAssignment.RoleDefinitionBindings)
$ctx.ExecuteQuery()
$PermissionLevels = ($RoleAssignment.RoleDefinitionBindings | Select -ExpandProperty Name) -join ","
#Get the User/Group Name
$Name = $RoleAssignment.Member.Title # $RoleAssignment.Member.LoginName
#Add the Data to Object
$Permissions = New-Object PSObject
$Permissions | Add-Member NoteProperty Name($Name)
$Permissions | Add-Member NoteProperty Type($PermissionType)
$Permissions | Add-Member NoteProperty PermissionLevels($PermissionLevels)
$PermissionCollection += $Permissions
}
Return $PermissionCollection
}
Catch {
write-host -f Red "Error Getting Folder Permissions!" $_.Exception.Message
}
}
#variables
$admin="santosh.sandy@micrososft.sharepoint.com"
$pass= ConvertTo-SecureString "TSDTD" -AsPlainText -Force
$SiteURL="https://sandy.sharepoint.com/sites/hgs_demo/"
$LibraryName="FolderTest";
$SrcFolderName="RootLibrary"
$NewFolderName="RootLibrary1"
$global:ctx
Try {
Connect-SPO -Username $admin -Url $SiteURL -AdminPassword $pass
$Library=$ctx.Web.Lists.GetByTitle($LibraryName);
$Folders = $Library.RootFolder.Folders
$ctx.Load($Library);
$ctx.Load($Folders)
$ctx.ExecuteQuery()
#Get existing folder names
$FolderNames = $Folders | Select -ExpandProperty Name
if($FolderNames -contains $NewFolderName)
{
write-host "Folder Exists Already!" -ForegroundColor Yellow
}
else{
$SourceFolderURL= $SiteURL + $LibraryName +"/" + $SrcFolderName
$TargetFolderURL= $SiteURL + $LibraryName +"/" + $NewFolderName
Copy-SPOFolder $SiteURL $SourceFolderURL $TargetFolderURL
$ctx.Load($Library);
$ctx.Load($Folders)
$ctx.ExecuteQuery()
$FolderNames = $Folders | Select -ExpandProperty Name
if($FolderNames -contains $NewFolderName)
{
$FolderRelativeURL= "/sites/hgs_demo/"+ $LibraryName +"/" + $NewFolderName
# write-host "Folder Exists Already!" -ForegroundColor Yellow
$cFolder = $ctx.Web.GetFolderByServerRelativeUrl($FolderRelativeURL)
$ctx.Load($cFolder)
$ctx.ExecuteQuery()
#Break Permission inheritence - Remove all existing list permissions & keep Item level permissions
$cFolder.ListItemAllFields.BreakRoleInheritance($False,$True)
$ctx.ExecuteQuery()
Write-host -f Yellow "Folder's Permission inheritance broken..."
$copyfolderRetaltiveurl= "/sites/hgs_demo/"+ $LibraryName +"/" + $SrcFolderName
$PermissionCopy= Get-SPOFolderPermission $SiteURL $copyfolderRetaltiveurl
foreach($Permission in $PermissionCopy)
{
Write-Host $Permission.Name +".." $Permission.Type +"..." $Permission.PermissionLevels
if($Permission.Type -eq "User")
{
$UserAccount =$Permission.Name
}
else{
$GroupName = $Permission.Name
}
#Get the SharePoint Group & User
$Group =$ctx.Web.SiteGroups.GetByName($GroupName)
$User = $ctx.Web.EnsureUser($UserAccount)
$ctx.load($Group)
$ctx.load($User)
$ctx.ExecuteQuery()
#Grant permission
#Get the role required
$Role = $ctx.Web.RoleDefinitions.GetByName($Permission.PermissionLevels)
$RoleDB = New-Object Microsoft.SharePoint.Client.RoleDefinitionBindingCollection($ctx)
$RoleDB.Add($Role)
#Assign permissions
$GroupPermissions = $cFolder.ListItemAllFields.RoleAssignments.Add($Group,$RoleDB)
$UserPermissions = $cFolder.ListItemAllFields.RoleAssignments.Add($User,$RoleDB)
$cFolder.Update()
$ctx.ExecuteQuery()
Write-host "Permission Granted Successfully!" -ForegroundColor Green
}#end of for each loop
}
}
}
Catch {
write-host -f Red "Error Granting permission to Folder!" $_.Exception.Message
}