无法查询 ldap/AD 组成员

Cannot query ldap/AD for group members

使用 Python 中的 ActiveDirectory 和 ldap3,我正在尝试检索组成员列表。意识到这是一个常见问题,我尝试了此处和 Google.

上发布的许多解决方案

这是我的情况:

目录设置:

使用ldap3,这段代码正确return用户列表:

server = Server('ricktestad2.mydomain.org')
conn = Connection(server, 'Admin', 'xxxxxx', client_strategy=SAFE_SYNC, auto_bind=True)
obj_person = ObjectDef(['person', 'organizationalPerson', 'user'] , conn)
r = Reader(conn, obj_person, 'OU=Users,OU=ricktestad2,DC=ricktestad2,DC=mydomain,DC=org')
r.search()

使用此代码检索群组 'rds.eval.mda.admin' 的成员 returns 0 个条目:

cn2='OU=Users,OU=ricktestad2,DC=ricktestad2,DC=mydomain,DC=org'
conn2 = Connection(server, 'Admin', 'xxxxxx', client_strategy=SAFE_SYNC, auto_bind=True)
conn2.search(
    search_base=cn2,
    search_filter='(&(objectCategory=group)(CN=rds.eval.mda.admin))',
    search_scope='SUBTREE',
    attributes = ['member'])

我尝试了无数次 cn 和过滤器的排列,但都没有成功。

有什么建议吗?

解决方案 1:memberOf(在 AD 中)存储为可分辨名称列表。您的过滤器需要类似于:

(&(objectCategory=user)(memberOf=cn=MyCustomGroup,ou=ouOfGroup,dc=subdomain,dc=domain,dc=com))

如果您还没有专有名称,可以使用以下方式搜索:

(&(objectCategory=group)(cn=myCustomGroup))

解决方案 2:

对于 Active Directory 用户,另一种方法是——假设您的所有组都存储在 OU=Groups,DC=CorpDir,DC=QA,DC=CorpName -- 使用查询 (&(objectCategory=group)(CN=GroupCN))。这适用于所有成员少于 1500 人的群组。如果您想列出大型 AD 组的所有成员,同样的查询也可以,但您必须使用 ranged retrieval 来获取所有成员,一次获取 1500 条记录。

如需更多参考,请查看这些 link1 and link2

解决方案 3:使用现代 ldapsearch 命令行工具的示例:

ldapsearch --port 1389 --baseDn 'ou=people,dc=example,dc=com' \
   --sizeLimit 3 --searchScope one --bindDn 'cn=directory manager' \
   --bindPasswordFile ~/.pwdFile \
  '(isMemberOf=cn=persons,ou=groups,dc=example,dc=com)' 1.1
dn: uid=terrygardner,ou=people,dc=example,dc=com
dn: uid=user.0,ou=people,dc=example,dc=com
dn: uid=user.1,ou=People,dc=example,dc=com
dn: uid=user.10,ou=People,dc=example,dc=com

此搜索响应表明该组中有多个成员的专有名称为 cn=persons,ou=groups,dc=example,dc=com。