protected static void CopySitePermissions(string sourceSiteUrl, string targetSiteUrl,string sourceClaimPrefix,string targetClaimPrefix,string targetClaimSuffix)
{
try
{
Console.WriteLine("\n\rStarting new site at: " + DateTime.Now + "\n\r");
LogStartingNewSite(sourceSiteUrl);
}
catch (Exception ex)
{
string strmsg = ex.Message;
}
AuthenticationManager authManagerSource = new AuthenticationManager();
using (ClientContext clientContextSource = authManagerSource.GetWebLoginClientContext(sourceSiteUrl))
{
Web sourceWeb = clientContextSource.Web;
clientContextSource.Load(sourceWeb, w => w.HasUniqueRoleAssignments);
clientContextSource.ExecuteQuery();
clientContextSource.RequestTimeout = 9999999;
AuthenticationManager authManagerTarget = new AuthenticationManager();
using (ClientContext clientContextTarget = authManagerTarget.GetWebLoginClientContext(targetSiteUrl))
{
clientContextTarget.RequestTimeout = 9999999;
Web targetWeb = clientContextTarget.Web;
clientContextTarget.Load(targetWeb, w => w.HasUniqueRoleAssignments, w => w.RoleDefinitions, w => w.ServerRelativeUrl, w => w.Title);
clientContextTarget.ExecuteQuery();
if (sourceWeb.HasUniqueRoleAssignments)
{
RoleAssignmentCollection roleAssignmentColl = sourceWeb.RoleAssignments;
clientContextSource.Load(roleAssignmentColl);
clientContextSource.ExecuteQuery();
foreach (RoleAssignment ra in roleAssignmentColl)
{
clientContextSource.Load(ra, r => r.Member, r => r.RoleDefinitionBindings);
clientContextSource.ExecuteQuery();
Principal principalMember = ra.Member;
if (principalMember.PrincipalType == PrincipalType.User)
{
string sourceUserID = ra.Member.LoginName;
foreach (RoleDefinition rd in ra.RoleDefinitionBindings)
{
try
{
if (rd.Name != "Limited Access")
{
string targetUserID = sourceUserID.Replace(sourceClaimPrefix, targetClaimPrefix) + targetClaimSuffix;
CopyUserPermissions(sourceUserID, targetUserID, sourceWeb, targetWeb, targetWeb.Title, "web", clientContextSource, clientContextTarget, rd.Name);
}
}
catch { }
}
}
}
}
ListCollection listColl = sourceWeb.Lists;
clientContextSource.Load(listColl, lc => lc.Include(l => l.HasUniqueRoleAssignments, l => l.Hidden, l => l.Title));
clientContextSource.ExecuteQuery();
foreach (List list in listColl)
{
if (list.HasUniqueRoleAssignments && (!list.Hidden))
{
RoleAssignmentCollection roleAssignmentColl = list.RoleAssignments;
clientContextSource.Load(roleAssignmentColl);
clientContextSource.ExecuteQuery();
foreach (RoleAssignment ra in roleAssignmentColl)
{
clientContextSource.Load(ra, r => r.Member, r => r.RoleDefinitionBindings);
clientContextSource.ExecuteQuery();
Principal principalMember = ra.Member;
if (principalMember.PrincipalType == PrincipalType.User)
{
string sourceUserID = ra.Member.LoginName;
foreach (RoleDefinition rd in ra.RoleDefinitionBindings)
{
try
{
if (rd.Name != "Limited Access")
{
string targetUserID = sourceUserID.Replace(sourceClaimPrefix, targetClaimPrefix) + targetClaimSuffix;
CopyUserPermissions(sourceUserID, targetUserID, sourceWeb, targetWeb, list.Title, "list", clientContextSource, clientContextTarget, rd.Name);
}
}
catch { }
}
}
}
}
}
}
}
}
public static void CopyUserPermissions(string sourceUserID, string targetUserID, Web sourceWeb, Web targetWeb, string objTitle, string objType, ClientContext sourceContext, ClientContext targetContext, string permLevel)
{
try
{
var targetUser = targetWeb.EnsureUser(targetUserID);
if (objType == "web")
{
if (!targetWeb.HasUniqueRoleAssignments)
{
targetWeb.BreakRoleInheritance(true, true);
targetContext.ExecuteQuery();
}
RoleDefinition role = targetWeb.RoleDefinitions.GetByName(permLevel);
targetContext.Load(role);
targetContext.ExecuteQuery();
RoleDefinitionBindingCollection roleBindingColl = new RoleDefinitionBindingCollection(targetContext);
roleBindingColl.Add(role);
targetWeb.RoleAssignments.Add(targetUser, roleBindingColl);
targetContext.ExecuteQuery();
try
{
LogOperation(targetWeb.ServerRelativeUrl, sourceUserID.Split('|')[2], "Web", objTitle);
Console.WriteLine("Added " + sourceUserID.Split('|')[2] + " in site: " + objTitle + " at " + targetWeb.ServerRelativeUrl);
}
catch (Exception ex)
{
string strmsg = ex.Message;
}
}
if (objType == "list")
{
List list = targetWeb.GetListByTitle(objTitle);
targetContext.Load(list, l => l.HasUniqueRoleAssignments, l => l.RoleAssignments);
targetContext.ExecuteQuery();
if (!list.HasUniqueRoleAssignments)
{
list.BreakRoleInheritance(true, true);
targetContext.ExecuteQuery();
}
RoleDefinition role = targetWeb.RoleDefinitions.GetByName(permLevel);
targetContext.Load(role);
targetContext.ExecuteQuery();
RoleDefinitionBindingCollection roleBindingColl = new RoleDefinitionBindingCollection(targetContext);
roleBindingColl.Add(role);
list.RoleAssignments.Add(targetUser, roleBindingColl);
targetContext.ExecuteQuery();
try
{
LogOperation(targetWeb.ServerRelativeUrl, sourceUserID.Split('|')[2], "List", objTitle);
Console.WriteLine("Added " + sourceUserID.Split('|')[2] + " in list: " + objTitle + " at " + targetWeb.ServerRelativeUrl);
}
catch (Exception ex)
{
string strmsg = ex.Message;
}
}
}
catch (Exception ex)
{
try
{
LogError(ex.Message, sourceUserID.Split('|')[2], targetWeb.ServerRelativeUrl);
Console.WriteLine("\n\rERROR at " + targetWeb.ServerRelativeUrl + " while adding " + sourceUserID.Split('|')[2] +
" in " + objType + " " + objTitle + " " +
" Message: " + ex.Message + "\n\r");
}
catch { }
}
}