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);
    }
  • 相关阅读:
    ExtJS5入门
    时间序列异常检测
    RNN实例
    数据清洗入门
    异常检测LOF
    sklearn异常检测demo
    孤立森林(Isolation Forest)
    WCF初见之SQL数据库的增删改查
    NHibernate与EF(Entity Framework)的区别
    解决IIS7虚拟目录出现HTTP 错误 500.19(由于权限不足而无法读取配置文件)的问题
  • 原文地址:https://www.cnblogs.com/jianyus/p/15750791.html
Copyright © 2011-2022 走看看