首页 > 解决方案 > 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.

标签: python-3.7ldap3

解决方案


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找到


推荐阅读