无法查询 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 条记录。
解决方案 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。
使用 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 条记录。
解决方案 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。