获取嵌套在另一个组中的组成员

本文关键字:组成员 另一个 嵌套 获取 | 更新日期: 2023-09-27 18:20:14

我正在开发一个intranet,只有当用户是Active Directory中某些组的成员时,它才会显示特定的链接。

我使用此代码来有效地检查用户是否是组的成员。如果组中只包含用户,效果很好,但如果组中嵌套了一个组,效果就不好了。我需要的是,即使嵌套组中有特定的用户,它也能正常工作!

public bool isMember(string user, string group)
{
    string value = "";
    bool isMember = false;
    try
    {
        DirectoryEntry entry = new DirectoryEntry(domain);
        DirectorySearcher mySearcher = new DirectorySearcher(entry);
        mySearcher.Filter = "sAMAccountname=" + user;
        SearchResult mySearchResult;
        mySearchResult = mySearcher.FindOne();
        PropertyValueCollection prop = mySearchResult.GetDirectoryEntry().Properties["memberOf"];
        for (int i = 0; i < prop.Count; i++)
        {
            value = prop[i].ToString();
            string[] groups = value.Split(',');
            foreach (string property in groups)
            {
                if (groups[1] == group)
                {
                    isMember = true;
                    break;
                }
            }
        }
        entry.Close();
        return isMember;
    }
    catch (COMException)
    {
        return false;
    }
}

我怎样才能做到这一点?

编辑:

我找到了这段代码,它允许我找到一个用户,即使是一个嵌套的组。问题是,只有当我的组织单元包含一个组时,它才有效,如果有多个组,它就不起作用。。。你认为我可以编辑一下使它正常工作吗??

public bool isMember(string user, string group)
{
    bool found = false;
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "domain");
    GroupPrincipal p = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, group);
    UserPrincipal u = UserPrincipal.FindByIdentity(ctx, user);
    found = p.GetMembers(true).Contains(u);
    p.Dispose();
    u.Dispose();
    return found;
}

此代码来自->此处<-

获取嵌套在另一个组中的组成员

您可以考虑使用tokenGroups向AD请求他们的令牌。看看http://dunnry.com/blog/EnumeratingTokenGroupsTokenGroupsInNET.aspx对于样品。

有两种方法可以做到这一点。

  1. 为找到的每个组递归检查memberOf属性。请注意,可能存在循环引用,因此您必须跟踪访问的组,以避免无限递归。

  2. 使用LDAP_MATCHING_RULE_IN_CHAIN规则直接或间接搜索用户所属的所有组。为此,您需要首先获取用户的DN,然后搜索包含该用户DN作为直接或间接成员的组。过滤器看起来像:

    String.Format("(member:1.2.840.113556.1.4.1941:={0})", userDN)
    

IIRC选项1通常更快,但当然需要更多的代码。