членство в группах чтения Python 3.7 и ldap3 - PullRequest
0 голосов
/ 20 ноября 2018

Я использую 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.

1 Ответ

0 голосов
/ 04 декабря 2018

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

...