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

Rob*_*nik 16 c# dns active-directory-group sharepoint-2010

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

foreach (SPUser user in SPContext.Current.Web.AllUsers)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

最重要的是,我可以将域安全组添加到Sharepoint组(如访问者),从而一次添加许多用户(更简单的管理).但是我的代码在第一次登录之前至少没有看到这些用户(如果他们有足够的权限).在这种情况下,我只能看到域安全组SPUser对象实例的IsDomainGroup设置为true.

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

Ste*_*fan 32

您可以使用该方法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);
Run Code Online (Sandbox Code Playgroud)

请注意,此方法不能解析嵌套的安全组.此外,执行用户需要SPBasePermissions.BrowseUserInfo在当前web上具有浏览用户信息权限().

更新:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

[...]采用Active Directory查询(这是我宁愿避免的,因为您可能需要足够的权限来执行此类操作[...]

当然,这是真的,但SharePoint也必须查找AD.这就是应用程序池服务帐户需要具有AD读取权限的原因.换句话说,如果运行恢复到进程帐户的代码,则应该安全地对AD执行查询.


Miz*_*-Mo 6

我建议你直接查询Active Directory.您正在花费大量精力尝试让SharePoint为您调用AD.每个具有域用户访问权限的帐户都应该能够查询嵌套在SharePoint中的AD组.我会去消息来源.

这样您就不必担心浏览用户权限或其他任何问题.在我看来,尝试通过SharePoint代理这一点只会让你的生活变得更加困难.

  • 小心添加一些c#代码怎么做?我知道我可以在网上找到它,但用一些代码支持你的答案会更好. (4认同)