python-ldap: получить только несколько записей из поиска LDAP - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу имитировать поведение флага ldapsearch -z при получении только набора записей из LDAP с использованием python-ldap

Однако, он продолжает сбой за исключением SIZELIMIT_EXCEEDED

Естьнесколько ссылок, где сообщается о проблеме, но предлагаемое решение не работает

Python-ldap search: Превышен предел размера

LDAP: ldap.SIZELIMIT_EXCEEDED

Я использую search_ext_s() с параметром sizelimit, установленным в 1, который, я уверен, не превышает ограничение сервера

На Wireshark,Я вижу, что возвращается 1 запись и сервер поднимает SIZELIMIT_EXCEEDED.Это то же самое, что и ldapsearch -z поведение

Но следующая строка вызывает исключение, и я не знаю, как получить возвращенную запись

conn.search_ext_s(<base>,ldap.SCOPE_SUBTREE,'(cn=demo_user*)',['dn'],sizelimit=1)

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Исходя из обсуждения в комментариях, вот как я этого добился:

import ldap

# These are not mandatory, I just have a habit
# of setting against Microsoft Active Directory

ldap.set_option(ldap.OPT_REFERRALS, 0)
ldap.set_option(ldap.OPT_PROTOCOL_VERSION, 3)

conn = ldap.initialize('ldap://<SERVER-IP>')
conn.simple_bind(<username>, <password>)

# Using async search version
ldap_result_id = conn.search_ext(<base-dn>, ldap.SCOPE_SUBTREE,
                                 <filter>, [desired-attrs],
                                 sizelimit=<your-desired-sizelimit>)
result_set = []
try:
  while 1:
    result_type, result_data = conn.result(ldap_result_id, 0)
    if (result_data == []):
      break
    else:
      # Handle the singular entry anyway you wish.
      # I am appending here
      if result_type == ldap.RES_SEARCH_ENTRY:
        result_set.append(result_data)
except ldap.SIZELIMIT_EXCEEDED:
  print 'Hitting sizelimit'

print result_set

Пример вывода:

# My server has about 500 entries for 'demo_user' - 1,2,3 etc.
# My filter is '(cn=demo_user*)', attrs = ['cn'] with sizelimit of 5

$ python ldap_sizelimit.py

Hitting sizelimit
[[('CN=demo_user0,OU=DemoUsers,DC=ad,DC=local', {'cn': ['demo_user0']})], 
[('CN=demo_user1,OU=DemoUsers,DC=ad,DC=local', {'cn': ['demo_user1']})], 
[('CN=demo_user10,OU=DemoUsers,DC=ad,DC=local', {'cn': ['demo_user10']})], 
[('CN=demo_user100,OU=DemoUsers,DC=ad,DC=local', {'cn': ['demo_user100']})], 
[('CN=demo_user101,OU=DemoUsers,DC=ad,DC=local', {'cn': ['demo_user101']})]]

Вы можете использовать тренировку с большим количеством элементов управления srv, чтобы отсортировать их и т. Д., Но я думаю, что основная идея передана;)

0 голосов
/ 21 сентября 2018

Необходимо использовать метод асинхронного поиска LDAPObject.search_ext () и собирать результаты отдельно с помощью LDAPObject.result () до тех пор, пока не будет сгенерировано исключение ldap.SIZELIMIT_EXCEEDED.

...