Не удается заставить Python ldap3 отображать схему

#python #ldap #ldap3

Вопрос:

У меня есть проект по удалению дубликатов в большой базе данных LDAP, но пока …

Я просто пытаюсь получить схему и ничего не вижу:

 >> import ldap3
>>> s = ldap3.Server('ldaps://omitted')
>>> s.schema
>>> s2 = ldap3.Server('ldaps://omitted',get_info=ldap3.ALL)
>>> s2.schema
>>> s2.info
>>> s.info
 

(пропущен URL-адрес, так как у меня еще нет разрешения от моего работодателя.)

Есть какие-нибудь идеи по этому поводу? Сервер настроен для обеспечения безопасности и не требует никакой аутентификации для подключения.

Комментарии:

1. Зачем вам нужна схема в исполняемой программе?

2. Мне нужно знать, как запрашивать данные; как это сделать, не видя схемы?

Ответ №1:

Ну, сначала вы должны связать свое соединение. Попробуйте это:

 from ldap3 import Connection, Server

# take 636 for secured connection, use_ssl=True may be necessary
server = Server('myhost.company.com', port=389) 
cnx = Connection(server, user='cn=user', password='whatever')
# either use auto_bind=True or set bind explicitly
cnx.bind()
# now you should be able to see the schema
# Caution: depending on the schema, it may take quite long to show it
print(server.schema)
 

Комментарии:

1. Я связывал его … Я попробовал именно то, что у вас есть выше, за исключением того, что это server.schema , а не cnx.schema , и я просто не получаю ничего в качестве вывода…

2. Он вернется к подсказке немедленно или вы, может быть, просто нетерпеливы? Я попробовал это на рекламном сервере, и прошло довольно много времени, пока я не получил вывод на свой экран.

3. Он вернулся ни с чем немедленно.

4. Но вы можете запросить свой каталог без каких-либо проблем, верно?

5. Что вы имеете в виду под «запросом в свой каталог»? Если я даже не могу видеть схему, как мне сделать что-нибудь еще?

Ответ №2:

Это лишь частичный ответ, но я добился некоторого прогресса. Важная информация заключалась в том, что сервер действительно требует аутентификации, хотя PHP-код, который я впервые увидел, похоже, его не использовал.

Теперь у меня есть этот код:

 
from pprint import pprint
from ldap3 import Server, Connection, SAFE_SYNC, ALL

search_base = '*omitted*'
search_filter = '(uid=mmcwiggins)'
attrs = ['*']

server = Server('ldaps://*omitted*', get_info=ALL)
mypass = 'not.really.the.pass'.encode('iso-8859-1')
connect = Connection(server, user='mmcwiggins', password=mypass)
connect.bind()
print(connect)
print(server.schema)
 

Это вызывает такую реакцию:

 ldaps://lbdc.secret.company.com:636 - ssl - user: mmcwiggins - not lazy - unbound - open - <local: 10.184.200.19:49737 - remote: 10.184.67.152:636> - tls not started - listening - SyncStrategy - internal decoder
None
 

Есть какие-нибудь идеи после того, как я это увидел?

Ответ №3:

Наконец-то я заставил это работать, используя ldapsearch вместо Python.

Мне помог местный гуру; ему нужен был файл .ldaprc в домашнем каталоге. Ключевым параметром в этом файле было TLS_REQCERT ALLOW.

Полная командная строка была такой (фирменный стиль отключен):

ldapsearch -x -D "SEAmmcwiggins" -b "DC=SEA,DC=CORP,DC=*****,DC=COM" -E pr=1000/noprompt -H ldaps://lbdc.sea.corp.******.com -W sAMAccountName='*' >bigresult