【问题标题】:Getting members of an AD domain group using Sharepoint API使用 Sharepoint API 获取 AD 域组的成员
【发布时间】:2011-05-17 22:02:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# dns sharepoint-2010 active-directory-group


    【解决方案1】:

    你可以使用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 一起使用?我没有测试,所以我只是问一个额外的问题。
    • 是的,使用SPUser.LoginName 作为input 参数。
    • 如果认为您的代码示例中有错误。行“如果(i.Type == SPPrincipalType.SecurityGroup)”。它应该是“i.PrincipalType”而不是“i.Type”(至少在 SharePoint 2010 中)。
    【解决方案2】:

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

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

    【讨论】:

    • 关心添加一些c#代码怎么做?我知道我可以在网上找到它,但用一些代码支持你的答案会更好。
    • 对不起,我还是新手。看起来您可以轻松修改它以针对您的问题实施强大的解决方案。 link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多