Warm tip: This article is reproduced from serverfault.com, please click

go-获取广告组中所有用户的sAMAccountName

(go - Getting the sAMAccountName for all users in a AD Group)

发布于 2020-12-08 21:34:18

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

在Go中:

我成功地从一个组(也可以遍历嵌套的组)检索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"},
    })

解决方法w问题:

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

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

Questioner
Per Olofsson
Viewed
11
raspy 2020-12-09 22:33:28

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

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

  1. 使用(&(objectCategory=group)(cn=TheGroup))带有作用域子树和属性的过滤器dn
  2. 将filter(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf=TheGroupDN))与scope子树和attribute一起使用sAMAccountName

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