【问题标题】:Getting the sAMAccountName for all users in a AD Group获取 AD 组中所有用户的 sAMAccountName
【发布时间】:2020-12-08 21:34:18
【问题描述】:

我遇到了一些问题,似乎应该有更好的解决方案来解决我的问题?

在围棋中:

我成功从组中检索 CN(也能够遍历嵌套组) 循环每个用户: 我虽然可以使用 CN 为该用户获取“sAMAccountName”

  • 尝试 1:从 l.Search 我得到下面的响应“Example1” - 在“,”之前有一个“\” - 使用它会产生异常。
  • 尝试 2:删除“\”(示例 2) - 返回 0 个条目
  • 尝试 3:删除“,”(在名称中) - 返回 0 个条目
  • 尝试 4:修改字符串以在名称周围添加“” - 返回 0 个条目
  • 尝试 5:使用 ldap.EscapeFilter() 的类似尝试都失败,但有异常或 0 个回复条目。

(userAccountControl - 删除禁用的用户 - 也没有它测试)

import (
    "gopkg.in/ldap.v2"
)
 
//First search for members in group
    sr, err := l.Search(&ldap.SearchRequest{
        BaseDN: "dc=ad,dc=some",
        Scope:      2, // subtree
        Filter:     "(&(objectCategory=group)(cn=TheGroup)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))",
        Attributes: []string{"member", "cn", "dn"},
    })
 
//Looping through the users from the reply
 
Example1: user="CN=Some\, Name,OU=ABCD,OU=UsersInternal,OU=Users,OU=DEFG,OU=HIJ,DC=ad,DC=some"
Example2: user="CN=Some, Name,OU=ABCD,OU=UsersInternal,OU=Users,OU=DEFG,OU=HIJ,DC=ad,DC=some"
Example3: user=\"CN="Some, Name\",OU=ABCD,OU=UsersInternal,OU=Users,OU=DEFG,OU=HIJ,DC=ad,DC=some"
Example4: user="CN='Some, Name',OU=ABCD,OU=UsersInternal,OU=Users,OU=DEFG,OU=HIJ,DC=ad,DC=some"
 
 
filter:=fmt.Sprintf("(%s)", user)
 
    result, err := l.Search(&ldap.SearchRequest{
        BaseDN:     "dc=ad,dc=some",
        Scope:      2, // subtree
        Filter:     filter,
        Attributes: []string{"sAMAccountName"},
    })

解决问题的方法:

user = "Some Name"
filter := fmt.Sprintf("(&(anr=%s)(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))", user)

当前的解决方法是使用 anr - 但后来我无法将搜索与我最初搜索的组结合起来......

【问题讨论】:

    标签: go ldap ldap-query


    【解决方案1】:

    我相信直接获取给定对象应该可以(甚至更快),因为您已经有了用户的 DN。我会使用用户的 DN 作为基础 DN(没有任何转义)并将范围设置为基础。不幸的是,我没有在 CN 中使用逗号的 AD 来运行测试。

    顺便说一句。 userAccountControl 属性是在用户对象上定义的,而不是在组上。如果您希望以这种方式进行过滤,实际上可能更容易将组名解析为 DN,然后发出一次搜索以获取所有用户,即:

    1. 使用过滤器(&(objectCategory=group)(cn=TheGroup)) 与范围子树和属性dn
    2. 将过滤器 (&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf=TheGroupDN)) 与范围子树和属性 sAMAccountName 一起使用。

    这样您将只发出两个查询,而不是分别查询每个用户。

    【讨论】:

    • 谢谢!当我在使用 (memberOf=TheGroup) 而不是 GroupDN 之前测试它时 - 现在它可以工作了!现在我只需要处理几个以“#”开头的组名...“//#”给出一个例外...
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多