获取 AD 组中所有用户的 sAMAccountName

Getting the sAMAccountName for all users in a AD Group

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

围棋:

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

(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 - 但后来我无法将搜索与我最初搜索的组结合起来...

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

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

  1. 使用具有范围子树和属性 dn
  2. 的过滤器 (&(objectCategory=group)(cn=TheGroup))
  3. 使用具有范围子树和属性 sAMAccountName 的过滤器 (&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf=TheGroupDN))

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