使用Sharepoint API获取AD域组的成员

16

在我的Sharepoint代码中,我通过以下方式显示所有定义的用户列表:

foreach (SPUser user in SPContext.Current.Web.AllUsers)
{
    ...
}

很棒的一点是,我可以将一个域安全组添加到SharePoint组(如访客),从而一次添加多个用户(简化管理)。但是我的代码至少在用户第一次登录之前(如果他们拥有足够的权限)看不到这些用户。在这种情况下,我只能看到具有其IsDomainGroup设置为trueSPUser对象实例中的域安全组。

是否有可能通过Sharepoint获取域组成员,而不需要进行Active Directory查询(因为我宁愿避免这样做,因为您可能需要足够的权限来执行此类操作=更多管理:Sharepoint权限+AD权限)。

2个回答

33

您可以使用方法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的查询应该是安全的。


1
好的。但它是否彻底展平嵌套组?因为内部成员也是主体。 - Robert Koritnik
好的,如果我枚举 SPContext.Current.Web.AllUsers 并到达域组,我可以使用该名称与 GetPrincipalsInGroup 一起使用吗?我还没有测试,所以只是问一个额外的问题。 - Robert Koritnik
1
是的,请使用SPUser.LoginName作为input参数。 - Stefan
1
如果您认为代码示例中存在错误。第 "if (i.Type == SPPrincipalType.SecurityGroup)" 行应为 "i.PrincipalType" 而不是 "i.Type"(至少在SharePoint 2010中)。 - Patric
这个答案对我非常有效,直到我部署到使用声明式身份验证的环境中。似乎其他人在从使用声明式身份验证的SharePoint查询AD方面也遇到了问题:https://sharepoint.stackexchange.com/questions/13223/sputility-getprincipalsingroup-and-claims-authentication-issue - lance
显示剩余2条评论

6
我建议直接查询Active Directory。你正在花费很多精力尝试让SharePoint代替你调用AD。每个具有域用户访问权限的帐户都应该能够查询你在SharePoint中嵌套的AD组。我会直接去源头查询。
这样你就不必担心浏览用户权限或任何其他问题。在我看来,试图通过SharePoint代理这个过程只会让你的生活更加困难。

4
您希望我提供一些 C# 代码来说明如何做到这一点?虽然您可以在网络上找到相关的信息,但使用代码支持您的答案会更好。 - Robert Koritnik
1
抱歉,我还是新手。看起来你可以轻松修改这个代码实现一个强大的解决方案来解决你的问题。链接 - Mizzle-Mo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接