我遇到了一些问题,似乎应该为我的问题找到更好的解决方案?
在Go中:
我成功地从一个组(也可以遍历嵌套的组)检索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"},
})
解决方法w问题:
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(不进行任何转义),并将范围设置为基本。不幸的是,我在CN中没有带逗号的广告来运行测试。
顺便提一句。userAccountControl
属性是在用户对象而非组上定义的。如果你希望采用这种方式进行过滤,则实际上可能更容易将组名解析为DN,然后发出一次搜索以获取所有用户,即:
(&(objectCategory=group)(cn=TheGroup))
带有作用域子树和属性的过滤器dn
,(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf=TheGroupDN))
与scope子树和attribute一起使用sAMAccountName
。这样,你将只发出两个查询,而不是分别查询每个用户。
谢谢!当我在使用(memberOf = TheGroup)而不是GroupDN之前进行测试时,它现在可以工作了!现在,我只需要处理一些以“#”开头的组名...“ //#”给出了一个例外...
挣扎于... stackoverflow.com/questions/65309123 / ...