#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