如何从属性获取LDAP嵌套组

时间:2019-07-31 12:33:53

标签: c# ldap ldap-query

我可以搜索用户并仅找到该用户所属的组。现在我想返回所有的组/角色,并将用户分配到特定的组/角色。

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

这是我用于搜索用户组/角色的正常工作代码。

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

enter image description here

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;

2 个答案:

答案 0 :(得分:1)

我不认为您正在使用Active Directory。告诉我的是,您是从用户的member属性中获取数据的。这不是与Active Directory配合使用的方式(它将为memberOf)。

我不确定您要的是什么。您的标题中提到了“嵌套的论坛”,这表示一个论坛是另一个论坛的成员。因此,我认为这意味着您要查找用户所属的每个组以及这些组是其成员的所有组,依此类推。如果是这样,您实际上必须找出您所使用的服务器类型连接到任何人都可以给您一个很好的答案之前。

但是在您的问题中,您说“我如何获得所有小组/角色?”那么这是否意味着您只想找到存在的每个组?为此,您可以进行一次新的搜索并将其用作过滤器:

(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,因此您可能需要对其进行调整。

答案 1 :(得分:0)

默认情况下,不检索 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