在 SharePoint 2013 中使用 CSOM 根据特定权限获取所有用户
Get all the users based on a specific permission using CSOM in SharePoint 2013
我想获取网站上拥有特定 role/permission 的所有用户的列表。例如,我需要在 SharePoint 2013 中使用 .Net CSOM 具有编辑权限 (RoleType=Editor) 的用户列表。他们可以在任何组中。我尝试了很多东西。但是,似乎没有直接的方法可以做到这一点。有任何想法吗?
提前致谢。
您可以利用Web.GetUserEffectivePermissions method获取指定用户在网站中拥有的有效权限。
示例 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);
}
}
}
我想获取网站上拥有特定 role/permission 的所有用户的列表。例如,我需要在 SharePoint 2013 中使用 .Net CSOM 具有编辑权限 (RoleType=Editor) 的用户列表。他们可以在任何组中。我尝试了很多东西。但是,似乎没有直接的方法可以做到这一点。有任何想法吗?
提前致谢。
您可以利用Web.GetUserEffectivePermissions method获取指定用户在网站中拥有的有效权限。
示例 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);
}
}
}