使用Sharepoint API获取AD域组的成员
在我的Sharepoint代码中,我通过以下方式显示所有已定义用户的列表:
foreach (SPUser user in SPContext.Current.Web.AllUsers) { ... }
最重要的是,我可以将域安全组添加到Sharepoint组(如访问者),从而一次添加许多用户(更简单的管理)。 但是我的代码在第一次登录之前至少没有看到这些用户(如果他们有足够的权限)。 在这种情况下,我只能看到域安全组SPUser
对象实例,其IsDomainGroup
设置为true
。
是否有可能通过Sharepoint获取域组成员而无需借助Active Directory查询(这是我宁愿避免的,因为您可能需要足够的权限来执行此类操作=更多管理:Sharepoint权限+ AD权限)。
您可以使用方法SPUtility.GetPrincipalsInGroup
( MSDN )。
除string input
,所有参数都是自解释的, 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);
请注意,此方法无法解析嵌套的安全组。 此外,执行用户需要在当前Web上具有浏览用户信息权限( SPBasePermissions.BrowseUserInfo
)。
更新:
private void ResolveGroup(SPWeb w, string name, List 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 users = new List (); 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执行查询。
我建议你直接查询Active Directory。 您正在花费大量精力尝试让SharePoint为您调用AD。 每个具有域用户访问权限的帐户都应该能够查询嵌套在SharePoint中的AD组。 我会去源头。
这样您就不必担心浏览用户权限或其他任何问题。 在我看来,尝试通过SharePoint代理这一点只会让你的生活变得更加困难。