protected static void CopySitePermissions_Source_Groups(string strUrl)
{
try
{
Console.WriteLine("\n\rStarting new site at: " + DateTime.Now + "\n\r");
LogStartingNewSite(strUrl);
}
catch (Exception ex)
{
string strmsg = ex.Message;
}
using (SPSite site = new SPSite(strUrl))
{
using (SPWeb Web = site.OpenWeb())
{
foreach (SPGroup siteGroup in Web.Groups)
{
foreach (SPUser objUser in siteGroup.Users)
{
try
{
string TargetUserID = SourceUserID + "@company.com";
if (Web.HasUniqueRoleAssignments)
{
CopyUserPermissions(SourceUserID, TargetUserID, Web, Web);
}
foreach (SPList List in Web.Lists)
{
if (List.HasUniqueRoleAssignments && (!List.Hidden))
{
CopyUserPermissions(SourceUserID, TargetUserID, Web, List);
}
if (List.Folders != null)
{
foreach (SPListItem folder in List.Folders)
{
if (folder.HasUniqueRoleAssignments)
{
CopyUserPermissions(SourceUserID, TargetUserID, Web, folder);
}
}
}
foreach (SPListItem item in List.Items)
{
if (item.HasUniqueRoleAssignments)
{
CopyUserPermissions(SourceUserID, TargetUserID, Web, item);
}
}
}
}
catch (Exception ex)
{
string strEx = ex.Message;
}
}
}
foreach (SPUser objUser in Web.Users)
{
try
{
string TargetUserID = SourceUserID + "@company.com";
if (Web.HasUniqueRoleAssignments)
{
CopyUserPermissions(SourceUserID, TargetUserID, Web, Web);
}
foreach (SPList List in Web.Lists)
{
if (List.HasUniqueRoleAssignments && (!List.Hidden))
{
CopyUserPermissions(SourceUserID, TargetUserID, Web, List);
}
if (List.Folders != null)
{
foreach (SPListItem folder in List.Folders)
{
if (folder.HasUniqueRoleAssignments)
{
CopyUserPermissions(SourceUserID, TargetUserID, Web, folder);
}
}
}
foreach (SPListItem item in List.Items)
{
if (item.HasUniqueRoleAssignments)
{
CopyUserPermissions(SourceUserID, TargetUserID, Web, item);
}
}
}
}
catch (Exception ex)
{
//log error
}
}
}
}
}
public static void CopyUserPermissions(string SourceUserID, string TargetUserID, SPWeb web, SPSecurableObject Object)
{
try
{
var SourceUser = web.EnsureUser(SourceUserID);
var TargetUser = web.EnsureUser(TargetUserID);
var SourcePermissions = Object.GetUserEffectivePermissionInfo(SourceUser.LoginName);
foreach (var SourceRoleAssignment in SourcePermissions.RoleAssignments)
{
List<string> SourceUserPermissions = new List<string>();
foreach (SPRoleDefinition SourceRoleDefinition in SourceRoleAssignment.RoleDefinitionBindings)
{
if (SourceRoleDefinition.Name != "Limited Access")
{
SourceUserPermissions.Add(SourceRoleDefinition.Name);
}
}
if (SourceUserPermissions.Count > 0)
{
if (SourceRoleAssignment.Member is SPGroup)
{
var Group = (SPGroup)SourceRoleAssignment.Member;
var flag = false;
foreach (SPUser user in Group.Users)
{
if (user.LoginName == TargetUserID)
{
flag = true;
}
}
if (!flag)
{
Group.AddUser(TargetUser);
try
{
LogOperation(web.ServerRelativeUrl, SourceUserID.Split('|')[2], "Group", Group.Name);
Console.WriteLine("Added " + SourceUserID.Split('|')[2] + " in Group: " + Group.Name + " at " + web.ServerRelativeUrl);
}
catch (Exception ex)
{
//log error
}
}
}
else
{
foreach (string NewRoleDefinition in SourceUserPermissions)
{
var NewRoleAssignment = new SPRoleAssignment(TargetUser);
NewRoleAssignment.RoleDefinitionBindings.Add(web.RoleDefinitions[NewRoleDefinition]);
if (Object.GetType().Equals(typeof(SPWeb)))
{
SPWeb spWeb = Object as SPWeb;
spWeb.RoleAssignments.Add(NewRoleAssignment);
spWeb.Update();
try
{
LogOperation(web.ServerRelativeUrl, SourceUserID.Split('|')[2], "Site", spWeb.Title);
Console.WriteLine("Added " + SourceUserID.Split('|')[2]+ " in Site: " + spWeb.Title + " at " + web.ServerRelativeUrl);
}
catch (Exception ex)
{
//log error
}
}
if (Object.GetType().Equals(typeof(SPList)))
{
SPList list = Object as SPList;
list.RoleAssignments.Add(NewRoleAssignment);
list.Update();
try
{
LogOperation(web.ServerRelativeUrl, SourceUserID.Split('|')[2], "List", list.Title);
Console.WriteLine("Added " + SourceUserID.Split('|')[2] + " in List: " + list.Title + " at " + web.ServerRelativeUrl);
}
catch (Exception ex)
{
string strmsg = ex.Message;
}
}
if (Object.GetType().Equals(typeof(SPListItem)))
{
SPListItem item = Object as SPListItem;
item.RoleAssignments.Add(NewRoleAssignment);
item.Update();
try
{
LogOperation(web.ServerRelativeUrl, SourceUserID.Split('|')[2], "Item", item.ID.ToString());
Console.WriteLine("Added " + SourceUserID.Split('|')[2]+ " in Item: " + item.ID.ToString() + " at " + web.ServerRelativeUrl);
}
catch (Exception ex)
{
//log error
}
}
}
}
}
}
}
catch (Exception ex)
{
try
{
LogError(ex.Message, SourceUserID.Split('|')[1], web.ServerRelativeUrl);
Console.WriteLine("\n\rERROR at " + web.ServerRelativeUrl + " while adding " + SourceUserID.Split('|')[1] +
" Message: " + ex.Message + "\n\r");
}
catch { }
}
}
Reference: https://www.sharepointdiary.com/2015/01/clone-sharepoint-user-permissions-using-powershell.html