LDAP3

Kleines Startbeispiel

# http://ldap3.readthedocs.io/welcome.html

from ldap3 import Server, Connection, ALL

server = Server('ipa.demo1.freeipa.org', get_info = ALL)
conn = Connection(
  server,
  'uid=admin,cn=users,cn=accounts,dc=demo1,dc=freeipa,dc=org',
  'Secret123',
  auto_bind = True)
print(conn)

print(conn.search('dc=demo1,dc=freeipa,dc=org', '(objectclass=person)'))
print(conn.entries)

for entry in conn.entries:
    print(entry.entry_to_json())

Suche im LDAP der TU Chemnitz

from ldap3 import Connection, SYNC
from ldap3.core.exceptions import LDAPSizeLimitExceededResult

# http://ldap3.readthedocs.io/welcome.html
# http://ldap3.readthedocs.io/tutorial_searches.html
#
# https://www.tu-chemnitz.de/urz/idm/services/ldap.html
#
# LDAP-Server: ldap.tu-chemnitz.de
# Port: 389
# Namens-Wurzel / Basis-DN: ou=Users,dc=tu-chemnitz,dc=de
# Suchfilter (optional): (mail=*)

connection_kwargs = {
    'server': 'ldap.tu-chemnitz.de',
    'auto_bind': True,
    #'client_strategy': SYNC,
}

conn = Connection(**connection_kwargs)
print(conn)

searchParameters = {'search_base': 'ou=Users,dc=tu-chemnitz,dc=de',
                    #'search_filter': '(& (objectClass=Person) (sn=Müller*))',
                    #'search_filter': '(& (objectClass=Person) (sn=Trapp*))',
                    'search_filter': '(mail=*berger*)',
                    'attributes': ['cn', 'givenName'],
                    'paged_size': 5 }

# paged search mit Funktion "paged_search()"
cnt = 0
entries = conn.extend.standard.paged_search(**searchParameters)
try:
    for entry in entries:
        print(entry)
        cnt += 1
except LDAPSizeLimitExceededResult:
    print('LDAPSizeLimitExceededResult')
print(cnt)

print('============')

# paged search mit eigenem Cookie-Handling
while True:
    # eine Page abfragen
    conn.search(**searchParameters)
    
    # gefundene Einträge ausgeben
    for entry in conn.entries:
        print(entry.entry_to_json())
        print(entry)

    # ggf. Übergang zur nächsten Page
    try:
        # print(conn.result['controls'])
        # {'1.2.840.113556.1.4.319': {'description': ('1.2.840.113556.1.4.319',
        # 'CONTROL', 'LDAP Simple Paged Results', 'RFC2696'), 'criticality': False,
        # 'value': {'size': 0, 'cookie': b'm\x00\x00\x00\x00\x00\x00\x00'}}}
        cookie = conn.result['controls']['1.2.840.113556.1.4.319']['value']['cookie']
        if cookie:
            searchParameters['paged_cookie'] = cookie
            print('next page')
        else:
            # wir haben alle Daten vollständig geholt, daher existiert kein
            # Cookie mehr
            print('no cookie')
            break
    except Exception as e:
        # der Key 'controls' existiert nicht, wenn die Maximale Entry-Zahl (bei
        # uns 100) abgerufen wurde
        print(repr(e))
        break