您可以使用方法SPUtility.GetPrincipalsInGroup
(MSDN)。
所有参数都是自说明的,除了string input
,它是安全组的NT帐户名称:
bool reachedMaxCount;
SPWeb web = SPContext.Current.Web;
int limit = 100;
string group = "Domain\\SecurityGroup";
SPPrincipalInfo[] users = SPUtility.GetPrincipalsInGroup(web, group, limit, out reachedMaxCount);
请注意,该方法无法解决嵌套安全组的问题。此外,执行用户需要在当前网站上具有浏览用户信息权限(SPBasePermissions.BrowseUserInfo
)。
更新:
private void ResolveGroup(SPWeb w, string name, List<string> users)
{
foreach (SPPrincipalInfo i in SPUtility.GetPrincipalsInGroup(w, name, 100, out b))
{
if (i.PrincipalType == SPPrincipalType.SecurityGroup)
{
ResolveGroup(w, i.LoginName, users);
}
else
{
users.Add(i.LoginName);
}
}
}
List<string> users = new List<string>();
foreach (SPUser user in SPContext.Current.Web.AllUsers)
{
if (user.IsDomainGroup)
{
ResolveGroup(SPContext.Current.Web, user.LoginName, users);
}
else
{
users.Add(user.LoginName);
}
}
编辑:
[...] 不得已要求查询Active Directory(这是我想避免的,因为您可能需要足够的权限执行此类操作[...]
当然,这是正确的,但SharePoint也必须查找AD。这就是为什么应用程序池服务帐户需要具有对AD的读取访问权限。
换句话说,如果您将代码还原为进程帐户,则执行针对AD的查询应该是安全的。
SPContext.Current.Web.AllUsers
并到达域组,我可以使用该名称与GetPrincipalsInGroup
一起使用吗?我还没有测试,所以只是问一个额外的问题。 - Robert KoritnikSPUser.LoginName
作为input
参数。 - Stefan