16

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

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

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

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

4

2 回答 2

32

您可以使用该方法SPUtility.GetPrincipalsInGroupMSDN)。

所有参数都是不言自明的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在当前 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);
    }
}

编辑:

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

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

于 2011-05-27T14:49:55.407 回答
6

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

这样您就不必担心浏览用户权限或其他任何事情。在我看来,试图通过 SharePoint 进行代理只会让您的生活更加困难。

于 2011-05-28T22:22:58.453 回答