如何从属性中获取 LDAP 嵌套组

How to get LDAP nested groups from attribute

我可以搜索用户并只找到用户所属的组。现在我想 return 所有 groups/roles 并将用户分配给特定的 group/role.

DirectoryEntry 和 PrincipalContext 在我的情况下不起作用,我已经尝试了好几天。

这是我用于搜索用户 group/roles 的工作代码,工作正常。

  1. 如何获得所有 groups/roles?
  2. 并将用户添加到 group/role
Container  = “ou=containername,ou=xx,ou=xx,O=xxxxx”
Domain = “mydomain.com” 
group = ou=groups,ou=containername,ou=xx,ou=xx,O=xxxx

List<string> roles = new List<string>();

SearchRequest request = new SearchRequest("", "(&(objectClass=person)(mail=myusername))", System.DirectoryServices.Protocols.SearchScope.Subtree);
SearchResponse response = (SearchResponse)con.SendRequest(request);

if (response.Entries.Count == 0)
{
    return null;
}
else
{
    foreach (SearchResultEntry entry in response.Entries)
    {
        if (entry.Attributes["member"] != null)
        {
            roles = (entry.Attributes["member"].GetValues(typeof(string))).ToArray().Select(r => r.ToString()
                    .Substring(r.ToString().IndexOf("cn=") + 3,
                     r.ToString().IndexOf(",") - 3))
                    .ToList();
        }
    }
}
return roles;

我认为您没有使用 Active Directory。告诉我的是,您正在从用户的 member 属性获取数据。这不是它与 Active Directory 一起工作的方式(它将是 memberOf)。

我不完全确定你的要求是什么。您的标题提到 "nested groups",这意味着当一个组是另一个组的成员时。所以我假设这意味着你想找到用户所属的每个组以及这些组所属的所有组,等等。如果是这样的话,你真的必须找出你是什么类型的服务器在任何人给你一个好的答案之前连接到。

但是在你的问题中你说 "How can i get all the groups/roles?" 那么这是否意味着你只想找到存在的每个组?为此,您可以进行新的搜索并将其用作过滤器:

(objectClass=group)

为了将用户添加到组中,我认为它会像这样(其中 userDn 是您要添加的用户的 distinguishedName,而 groupDn 是该组):

var mod = new DirectoryAttributeModification {
    Name = "member",
    Operation = DirectoryAttributeOperation.Add
}
mod.Add(userDn);

var response = (ModifyResponse) connectionObject.SendRequest(
    new ModifyRequest {
        DistinguishedName = groupDn,
        Modifications = { mod }
    }
);

但我从未实际使用过 LdapConnection,因此您可能需要对其进行调整。

默认情况下,不检索 ADLDS 或 AD MemberOf(用户对象)成员(组对象)属性。

用户示例解决方案

SearchRequest request = new SearchRequest("", "(&(objectClass=user)(mail=myusername))", System.DirectoryServices.Protocols.SearchScope.Subtree);

request.Attributes.Add("memberOf");

或群组

SearchRequest request = new SearchRequest("", "(&(objectClass=group))", System.DirectoryServices.Protocols.SearchScope.Subtree);

request.Attributes.Add("member");

Default LDAP Filters and Attributes for Users, Groups and Containers