zoukankan      html  css  js  c++  java
  • SharePoint CSOM 迁移列表项权限

      前言

      最近,在帮客户做数据迁移的项目,艾玛,这真是一言难尽啊,xxx...aafdsjlsadjfljiojoij...

      正文

      好了,吐槽完了,我们说正事儿!其实,迁移权限也没什么复杂的,因为时间比较紧张,自己也没特别看代码的规范,大家凑合看吧,反正我是照镜子不先自己丑,不过也不会对着镜子问谁是最美的。

      代码,真的没什么好说的,整体逻辑就是获取源数据项目,看权限是不是断开,如果断开就迁移权限。

      然后,获取当前项(迁移过程已经创建好),断开权限,清空权限,迁移权限。迁移过程要注意用户和用户组迁移方式不一样,web.ensureuser可能会返回空(大厂小厂离职都是常有的,即使不离职觉得自己账号看腻了,也有改动的),要有异常处理。

      最后,日志要记录清楚,哪个用户迁移的什么权限,或者有迷失的用户或者组什么的。

      好了,最后的最后,大家自己看代码吧~

    ListItem currentItem = currentLibrary.GetItemById(currentItemId);
    currentContext.Load(currentItem, a => a.HasUniqueRoleAssignments);
    currentContext.ExecuteQuery();
    
    if (currentItem.HasUniqueRoleAssignments)
    {
        ListItem sourceItem = sourceLibrary.GetItemById(sourceItemId);
    
        //读取权限
        sourceContext.Load(sourceItem, a => a.RoleAssignments.Include(roleAsg => roleAsg.Member.LoginName, roleAsg => roleAsg.Member.Title,
            roleAsg => roleAsg.RoleDefinitionBindings.Include(roleDef => roleDef.Name,
            roleDef => roleDef.Description, roleDef => roleDef.RoleTypeKind)));
        sourceContext.ExecuteQuery();
    
        currentContext.Load(currentItem, a => a.RoleAssignments.Include(roleAsg => roleAsg.Member.LoginName, roleAsg => roleAsg.Member.Id, 
            roleAsg => roleAsg.RoleDefinitionBindings.Include(roleDef => roleDef.Name, 
            roleDef => roleDef.Description, roleDef => roleDef.RoleTypeKind)));
        currentContext.ExecuteQuery();
    
        //清空权限
        for (var m = 0; m < currentItem.RoleAssignments.Count; m++)
        {
            RoleAssignment r = currentItem.RoleAssignments[m];
            currentItem.RoleAssignments.GetByPrincipalId(r.Member.Id).DeleteObject();
            currentContext.ExecuteQuery();
        }
    
        //设置权限
        for (int j = 0; j < sourceItem.RoleAssignments.Count; j++)
        {
            RoleAssignment roleAsg = sourceItem.RoleAssignments[j];
            var addRole = new RoleDefinitionBindingCollection(currentContext);
    
            List<string> roles = new List<string>();
            foreach (var role in roleAsg.RoleDefinitionBindings)
            {
                RoleDefinition myRole = currentWeb.RoleDefinitions.GetByName(role.Name);
                addRole.Add(myRole);
                roles.Add(role.Name);
            }
    
            if (roleAsg.Member.ToString() == "Microsoft.SharePoint.Client.User")
            {
                string userName = roleAsg.Member.LoginName;
                try
                {
                    User user = currentWeb.EnsureUser(userName);
                    currentItem.RoleAssignments.Add(user, addRole);
                    currentItem.Update();
                    currentContext.ExecuteQuery();
                }
                catch{}
            }
            else
            {
                string groupName = string.Empty;
                try
                {
                    Group group = currentWeb.SiteGroups.GetByName(groupName);
                    currentItem.RoleAssignments.Add(group, addRole);
                    currentItem.Update();
                    currentContext.ExecuteQuery();
                }
                catch{}
            }
        }
    }
    else
    {
        Helper.writeLogs("There is no unique permission.", MigrationLog);
    }
  • 相关阅读:
    为蓝桥杯准备
    Java里子类调用父类构造方法问题
    boost库的Singleton的实现以及static成员的初始化问题
    VS2005调试小记
    <转载>程序员每天该做的事
    vs2005, 2008 使用了未初始化的msg变量
    转载 vs2005 快捷键大全
    VS2005右键点击转到定义后出现“未定义符号”的提示及其解决
    软件工程配置规范(VC2005) 第二版(转载)
    匆忙赶路的时候别忘了适时停下来回头看看
  • 原文地址:https://www.cnblogs.com/jianyus/p/15750791.html
Copyright © 2011-2022 走看看