Blog链接:https://blog.51cto.com/13969817
由于日常工作的需要,我们可能会整合文件夹中的文件集中管理,这种情况下,我们可以采用Move to的功能或者PowerShell的脚本将文档从一个文件夹迁移到另一个文件夹,或者用OneDrive for Business客户端做少量数据的迁移,但文档迁移之后,复杂的权限在不使用第三方工具的前提下,该如何操作呢?
解决方案:今天给大家分享一下如何使用PowerShell将文件夹权限复制到同一文档库的另一个文件夹上。
具体操作步骤:
1. 连接PnPOnline,命令如下:

2. 获取WebURL,并赋给$WebURL,命令如下:
$WebURL = https://mvptrainingcn.sharepoint.com/sites/Contoso_China

3. 获取源端要复制的文件夹URL,并赋给$SourceFolderURL命令如下:
$SourceFolderUR= "/sites/Contoso_China/Support Training/Microsoft 365 Documents"

4. 获取目的端的文件夹URL,并赋给$TargetFolderURL,命令如下:
$TargetFolderURL= "/sites/Contoso_China/Support Training/Support Team_Technical"

5. 调用函数Copy-PnPFolderPermissions,命令如下所示:
Function Copy-PnPFolderPermissions
{
    [cmdletbinding()]
     param(
         [Parameter(Mandatory=$True)] [string] $WebURL,
         [Parameter(Mandatory=$True)] [string] $SourceFolderURL,
         [Parameter(Mandatory=$True)] [string] $TargetFolderURL,
         [Parameter(Mandatory=$False)] [Bool] $AppendToExisting = $True
     )
    Try {
        Connect-PnPOnline -Url $WebURL -Interactive
        $Web = Get-PnPweb
        $Ctx = Get-PnPContext
        $SourceFolderItem = Get-PnPFolder -Url $SourceFolderURL -Includes ListItemAllFields.HasUniqueRoleAssignments
        $SourceFolder = $SourceFolderItem.ListItemAllFields
        $TargetFolderItem = Get-PnPFolder -Url $TargetFolderURL -Includes ListItemAllFields.HasUniqueRoleAssignments
        $TargetFolder = $TargetFolderItem.ListItemAllFields
        If(!$TargetFolder.HasUniqueRoleAssignments)
        {
            If($AppendToExisting -eq $True)
            {
                $TargetFolder.BreakRoleInheritance($True,$False)
            }
            else
            {
                $TargetFolder.BreakRoleInheritance($False,$False)
            }
        }
        Else 
        {
            If($AppendToExisting -eq $False)
            {
                $TargetFolder.ResetRoleInheritance()
                $TargetFolder.BreakRoleInheritance($False,$False)
            }
        }
        Invoke-PnPQuery
        $SourceRoleAssignments = Get-PnPProperty -ClientObject $SourceFolder -Property RoleAssignments
        ForEach($RoleAssignment in $SourceRoleAssignments)
        {
            Get-PnPProperty -ClientObject $RoleAssignment -Property RoleDefinitionBindings, Member
            If($RoleAssignment.Member.IsHiddenInUI -eq $False)
            {
                $SourcePermissions = $RoleAssignment.RoleDefinitionBindings | Where {$_.Name -notin("Limited Access")}
                $PermissionLevels = ($SourcePermissions | Select -ExpandProperty Name) -join "; "
 
                If($SourcePermissions -ne $null)
                {
                    $RoleDefBindings = New-Object Microsoft.SharePoint.Client.RoleDefinitionBindingCollection($Ctx)
                    ForEach($RoleDefinition in $SourcePermissions)
                    {
                        $RoleDefBindings.Add($RoleDefinition)
                    }
                    $Permissions = $TargetFolder.RoleAssignments.Add($RoleAssignment.Member,$RoleDefBindings)
                    $TargetFolder.Update()
                    Invoke-PnPQuery
                    Write-host "Copied '$($RoleAssignment.Member.Title)' with Permissions '$PermissionLevels'"
                }
            }
        }
    }
    Catch {
        write-host -f Red "Error Copying Folder Permissions!" $_.Exception.Message
    }
} 说明:
说明:
- 调用该函数仅仅是将权限从源端文件夹复制到目的端已经存在的文件夹,并非将目的端文件夹的权限清除,再将源端文件夹的权限复制到目的端文件夹
- 文件夹权限复制仅限于同一个文档库之间,若跨不同文档库或者网站之间转移,需要额外修改脚本
6. 执行权限复制,命令如下:
Copy-PnPFolderPermissions -WebURL $WebURL -SourceFolderURL $SourceFolderURL -TargetFolderURL $TargetFolderURL

执行成功,权限已经成功复制到目的端,说明:脚本支持对共享权限的复制,关于跨文档库支持文件夹的权限复制,将涉及User和Role是否存在的判断,相对较复杂,若大家日后有类似需求,欢迎线下交流。










