Получите всех пользователей на основе определенного разрешения с помощью CSOM в SharePoint 2013

Я хочу получить список всех пользователей, у которых есть определенная роль / разрешение на сайте. Например, мне нужен список пользователей с правами редактирования (RoleType = Editor) с помощью .Net CSOM в SharePoint 2013. Они могут быть в любой группе. Я много чего перепробовал. Однако кажется, что нет прямого способа сделать это. Любые идеи?

Большое спасибо.


person Mohan Divraniya    schedule 09.01.2015    source источник


Ответы (1)


Вы можете использовать Web .GetUserEffectivePermissions, чтобы получить действующие разрешения, которые имеет указанный пользователь на веб-сайте.

Пример 1. Получение пользователей по разрешению

В первом примере показано, как получать пользователей с помощью разрешения, в частности пользователей, которые могут редактировать элементы списка (используя PermissionKind.EditListItems):

using (var ctx = new ClientContext(webUri))
{
      //Retrieve site users             
      var users = ctx.LoadQuery(ctx.Web.SiteUsers.Where(u => u.PrincipalType == PrincipalType.User));
      ctx.ExecuteQuery();
      //Retrieve users permissions
      var userPermissionsResults = users.ToDictionary(user => user, user => ctx.Web.GetUserEffectivePermissions(user.LoginName));
      ctx.ExecuteQuery();
      //Filter the users who can edit list items      
      var usersCanEditListItems = new List<User>();
      foreach (var result in userPermissionsResults)
      {
          var user = result.Key;
          var userPermissions = result.Value.Value;
          if (userPermissions.Has(PermissionKind.EditListItems))
          {
             usersCanEditListItems.Add(user);
          }
      }
 }

Пример 2: получение пользователей по ролям

В случае типа роли или уровней разрешений пример становится немного сложнее, поскольку нам необходимо:

  • получить список разрешений для типа роли (шаг 1 и 2)
  • получить пользователей с разрешениями (шаг 3 и 4)
  • фильтровать пользователей по разрешениям ролей (шаг 5)

Пример:

using (var ctx = new ClientContext(webUri))
{

     //1.Retrieve role definition 
     var roleDef = ctx.Web.RoleDefinitions.GetByType(RoleType.Editor);
     ctx.Load(roleDef);
     ctx.ExecuteQuery();
     //2.Get permission levels for role 
     var permLevelNames = Enum.GetNames(typeof (PermissionKind));
     var permissionLevels = permLevelNames.Select(permLevelName => (PermissionKind) Enum.Parse(typeof (PermissionKind), permLevelName)).Where(permissionLevel => roleDef.BasePermissions.Has(permissionLevel)).ToList();

     //3.Retrieve users
     var users = ctx.LoadQuery(ctx.Web.SiteUsers.Where(u => u.PrincipalType == PrincipalType.User ));
     ctx.ExecuteQuery();
     //4.Retrieve users permissions
     var userPermissionsResults = users.ToDictionary(user => user, user => ctx.Web.GetUserEffectivePermissions(user.LoginName));
     ctx.ExecuteQuery();

     //5.Filter users by role
     var editorUsers = new List<User>();
     foreach (var result in userPermissionsResults)
     {
         var user = result.Key;
         var userPermissions = result.Value.Value;
         var hasPermissions = permissionLevels.All(userPermissions.Has); //has the same permissions?
         if (hasPermissions)
         {
             editorUsers.Add(user);
         }
     }
 }  
person Vadim Gremyachev    schedule 10.01.2015