获取 AD 组中所有用户的 sAMAccountName
Getting the sAMAccountName for all users in a AD Group
我遇到了一些问题,似乎应该有更好的解决方案?
围棋:
我成功从一个组中取出CN(也可以遍历嵌套组)
循环每个用户:
我虽然可以使用 CN 为该用户获取“sAMAccountName”
- 尝试 1:从 l.Search 我得到下面的响应“Example1” - 在“,”之前有一个“\” - 使用它会出现异常。
- 尝试 2:删除“\”(示例 2)- Returns 有 0 个条目
- 尝试 3:删除“,”(在名称中)- Returns 有 0 个条目
- 尝试 4:修改字符串以在名称周围添加“””- Returns 有 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 - 但后来我无法将搜索与我最初搜索的组结合起来...
我相信直接获取给定对象应该可以(甚至更快),因为您已经有了用户的 DN。我会使用用户的 DN 作为基本 DN(没有任何转义)并将范围设置为基本。不幸的是,我没有在 CNs 中用逗号来 运行 测试的广告。
顺便说一句。 userAccountControl
属性是在用户对象上定义的,而不是组。如果您希望以这种方式进行过滤,那么将组名解析为 DN 然后执行一次搜索以获取所有用户实际上可能更容易,即:
- 使用具有范围子树和属性
dn
、 的过滤器 (&(objectCategory=group)(cn=TheGroup))
- 使用具有范围子树和属性
sAMAccountName
的过滤器 (&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf=TheGroupDN))
。
这样您将只发出两个查询,而不是分别查询每个用户。
我遇到了一些问题,似乎应该有更好的解决方案?
围棋:
我成功从一个组中取出CN(也可以遍历嵌套组) 循环每个用户: 我虽然可以使用 CN 为该用户获取“sAMAccountName”
- 尝试 1:从 l.Search 我得到下面的响应“Example1” - 在“,”之前有一个“\” - 使用它会出现异常。
- 尝试 2:删除“\”(示例 2)- Returns 有 0 个条目
- 尝试 3:删除“,”(在名称中)- Returns 有 0 个条目
- 尝试 4:修改字符串以在名称周围添加“””- Returns 有 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 - 但后来我无法将搜索与我最初搜索的组结合起来...
我相信直接获取给定对象应该可以(甚至更快),因为您已经有了用户的 DN。我会使用用户的 DN 作为基本 DN(没有任何转义)并将范围设置为基本。不幸的是,我没有在 CNs 中用逗号来 运行 测试的广告。
顺便说一句。 userAccountControl
属性是在用户对象上定义的,而不是组。如果您希望以这种方式进行过滤,那么将组名解析为 DN 然后执行一次搜索以获取所有用户实际上可能更容易,即:
- 使用具有范围子树和属性
dn
、 的过滤器 - 使用具有范围子树和属性
sAMAccountName
的过滤器(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf=TheGroupDN))
。
(&(objectCategory=group)(cn=TheGroup))
这样您将只发出两个查询,而不是分别查询每个用户。