如何将文件夹权限从源复制到目标

问题描述 投票:0回答:1

我有一个代码,可以将文件夹结构从 1 个站点复制到另一个站点,问题是如果组在 2 个站点中具有相同的名称,如何复制文件夹访问权限。

组名称:PTO
组名:IK
组名称:ITN
小组名称:设计师
组标题:客户
组标题:承包商\

using PnP.Framework;
using Microsoft.SharePoint.Client;
using Folder = Microsoft.SharePoint.Client.Folder;
        public void CopyFolderStructureBetweenSites(string siteUrl)
        {
            string sourceSiteUrl = "MYSITEURL";
            string sourceLibraryName = "Documents";
            string targetLibraryName = "Documents";
            string folderName = "General";
            using ClientContext sourceContext  = GetSharePointContext(_clientId, _certPath, _certPass, _tenantName,
                sourceSiteUrl);
            using ClientContext targetContext = GetSharePointContext(_clientId, _certPath, _certPass, _tenantName,
                       siteUrl);
            
                // Getting the folder to copy from the source library
                Folder sourceFolder = GetFolder(sourceContext, sourceLibraryName, folderName);
                if (sourceFolder != null)
                {
                    // Check if the target library exists, if not, create it
                    List targetLibrary = EnsureTargetLibrary(targetContext, targetLibraryName);

                    CopyFolder(sourceContext, targetContext, sourceFolder, targetLibrary);
                    Console.WriteLine("Done.");
                }
                else
                {
                    Console.WriteLine("Unluck.");
                }
            
        }
        private void CopyFolder(ClientContext sourceContext, ClientContext targetContext, Folder sourceFolder, List targetLibrary)
        {
            targetContext.Load(targetLibrary.RootFolder);
            targetContext.ExecuteQuery();

            var folderUrl = targetLibrary.RootFolder.ServerRelativeUrl + "/" + sourceFolder.Name;
            Folder newFolder = targetLibrary.RootFolder.Folders.Add(sourceFolder.Name);
            targetContext.ExecuteQuery();
            CopyFolderRecursive(sourceContext, targetContext, sourceFolder, newFolder);
        }
        private void CopyFolderRecursive(ClientContext sourceContext, ClientContext targetContext, Folder sourceFolder, Folder targetFolder)
        {
            sourceContext.Load(sourceFolder.Files);
            sourceContext.Load(sourceFolder.Folders);
            sourceContext.ExecuteQuery();

            foreach (Folder subFolder in sourceFolder.Folders)
            {
                var newTargetFolder = targetFolder.Folders.Add(subFolder.Name);
                targetContext.ExecuteQuery();
                CopyFolderRecursive(sourceContext, targetContext, subFolder, newTargetFolder);
            }
        }
c# .net sharepoint-online csom pnp-framework
1个回答
0
投票

总的来说,在人工智能的一点帮助下,我解决了这个问题

        private void CopyFolderPermissions(ClientContext sourceCtx, ClientContext targetCtx, Folder sourceFolder, Folder targetFolder, string sourceDisplayName, string targetDisplayName)
    {
        var roleAssignments = sourceFolder.ListItemAllFields.RoleAssignments;
        sourceCtx.Load(roleAssignments);
        sourceCtx.ExecuteQuery();

        foreach (var assignment in roleAssignments)
        {
            var roleDefinitionBindings = assignment.RoleDefinitionBindings;
            sourceCtx.Load(assignment.Member);
            sourceCtx.Load(roleDefinitionBindings);
            sourceCtx.ExecuteQuery();

            // Replace the display name in the group's login name
            var groupName = assignment.Member.LoginName.Replace(sourceDisplayName, targetDisplayName);
    
            Group principal = null;
            try 
            {
                principal = targetCtx.Web.SiteGroups.GetByName(groupName);
                targetCtx.Load(principal);
                targetCtx.ExecuteQuery();
            } 
            catch (ServerException) 
            { 
                // Do nothing, Group doesn't exist.
            }

            if(principal != null)
            {
                var newRoleDefBindings = new RoleDefinitionBindingCollection(targetCtx);
                foreach (var roleDef in roleDefinitionBindings)
                {
                    // exclude Limited Access level
                    if(roleDef.RoleTypeKind != RoleType.Guest)
                    {
                        newRoleDefBindings.Add(targetCtx.Web.RoleDefinitions.GetById(roleDef.Id));
                    }
                }

                // Stop inheriting permissions
                targetFolder.ListItemAllFields.BreakRoleInheritance(false, false);
        
                // Add new role assignments
                targetFolder.ListItemAllFields.RoleAssignments.Add(principal, newRoleDefBindings);
            }
        }

        targetCtx.ExecuteQuery();
    }
© www.soinside.com 2019 - 2024. All rights reserved.