python-3.7 - python 3.7 和 ldap3 阅读组成员资格
问题描述
我正在使用 Python 3.7 和 ldap3。我可以建立连接并检索我感兴趣的组列表。不过,我很难获得小组成员。
server = Server('ldaps.ad.company.com', use_ssl=True, get_info=ALL)
with Connection(server, 'mydomain\\ldapUser', '******', auto_bind=True) as conn:
base = "OU=AccountGroups,OU=UsersAndGroups,OU=WidgetDepartment," \
+ "OU=LocalLocation,DC=ad,DC=company,DC=com"
criteria = """(
&(objectClass=group)
(
|(sAMAccountName=grp-*widgets*)
(sAMAccountName=grp-oldWidgets)
)
)"""
attributes = ['sAMAccountName', 'distinguishedName']
conn.search(base, criteria, attributes=attributes)
groups = conn.entries
此时groups
包含我想要的所有组。我想遍历组以收集成员。
for group in groups:
# print(cn)
criteria = f"""
(&
(objectClass=person)
(memberof:1.2.840.113556.1.4.1941:={group.distinguishedName})
)
"""
# criteria = f"""
# (&
# (objectClass=person)
# (memberof={group.distinguishedName})
# )
# """
attributes = ['displayName', 'sAMAccountName', 'mail']
conn.search(base, criteria, attributes=attributes)
people = conn.entries
我知道组中有人,但people
总是一个空列表。我是否进行递归搜索并不重要。
我错过了什么?
编辑
这个问题有一个更长的背景故事,太长了,无法深入探讨。不过,我对这个特定问题有一个理论。我的时间不多了,并切换到了一个不同的 python LDAP 库——它正在工作。我认为这个问题的问题可能是我在多行上“格式化”了查询。新的 ldap lib ( python-ldap
) 抱怨了,我去掉了换行符,它就可以工作了。我没有时间回去用ldap3
.
解决方案
people
在您的循环组的每次迭代中被覆盖。group
也许最后一个条目的搜索结果groups
是空的。
您应该在循环之外初始化一个空列表并用您的结果扩展它:
people = []
for group in groups:
...
conn.search(...)
people.extend(conn.entries)
关于您上面的代码片段的另一个说明。在搜索过滤器中将 objectClass 定义与属性定义组合时,您可以考虑使用Reader
将在内部组合它们的类。
此外,我想指出,我创建了一个对象关系映射器,您可以在其中使用声明性 Python 语法简单地定义查询,例如:
from ldap3_orm import ObjectDef, Reader
from ldap3_orm.config import config
from ldap3_orm.connection import conn
PersonDef = ObjectDef("person", conn)
r = Reader(conn, PersonDef, config.base_dn, PersonDef.memberof == group.distinguishedName)
r.search()
ldap3-orm 文档可以在http://code.bsm-felder.de/doc/ldap3-orm找到
推荐阅读
- node.js - 从字段列表创建 Formik 表单
- javascript - 动作完成后执行函数
- bash - 如何从命令行打开新的 VSCode 终端窗口
- reactjs - Node Express.js 服务器端渲染不在生产环境中运行
- swift - 如何隐藏导航栏 Swift
- java - ImageLayoutBinding 存在,ImageLayoutBindingImpl 不存在,DataBinderMapperImpl 正在寻找 impl 文件。我怎样才能解决这个问题?
- python - Python 结合来自 FTP 的 CVS 并输出它们
- go - 附加不适用于定义为结构类型切片的命名类型
- c# - C# 从 UserControl 更改主窗体的 UI
- angular - 如何配置 Wildfly 以重写 Angular 应用程序的 URL