我有一个代码,可以将文件夹结构从 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);
}
}
总的来说,在人工智能的一点帮助下,我解决了这个问题
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();
}