ldapsearch работает, а python-ldap нет

Следующее работает и возвращает список всех пользователей

ldapsearch -x -b "ou=lunchbox,dc=office,dc=lbox,dc=com" -D "OFFICE\Administrator" -h ad.office.lbox.com -p 389 -W "(&(objectcategory=person)(objectclass=user))"

Я пытаюсь сделать то же самое в Python и получаю Invalid credentials

#!/usr/bin/env python

import ldap

dn = "cn=Administrator,dc=office,dc=lbox,dc=com"
pw = "**password**"

con = ldap.initialize('ldap://ad.office.lbox.com')
con.simple_bind_s( dn, pw )

base_dn = 'ou=lunchbox,dc=office,dc=lbox,dc=com'
filter = '(objectclass=person)'
attrs = ['sn']

con.search_s( base_dn, ldap.SCOPE_SUBTREE, filter, attrs )

Любые предложения, чтобы сделать эту работу было бы здорово. Я пытаюсь научиться python-ldap Спасибо

РЕДАКТИРОВАТЬ

Это полная ошибка, которую я получаю:

`ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1', 'desc': 'Invalid credentials'}`

Сервер LDAP — это Active Directory в Windows Server 2008 R2.


person David Vasandani    schedule 12.11.2012    source источник
comment
у вас возвращается ошибка? есть ли что-то в ваших журналах ldap?   -  person Don Question    schedule 13.11.2012
comment
@DonQuestion Я добавил к вопросу полную ошибку. В журналах Active Directory ничего нет. Я не подумал упомянуть, что подключаюсь к AD на Win2008 R2.   -  person David Vasandani    schedule 13.11.2012
comment
похоже, у вас проблемы с аутентификацией. Я предполагаю, что это противоречит методу привязки ?! взгляните на packtpub.com/article/   -  person Don Question    schedule 13.11.2012
comment
Да, я надеюсь, кто-нибудь может сказать мне, почему привязка python-ldap отличается от привязки ldapsearch.   -  person David Vasandani    schedule 13.11.2012
comment
Вы пробовали аутентифицироваться только с помощью cn=Administrator или Administrator?   -  person dearlbry    schedule 13.11.2012
comment
нет никакой разницы. Вы аутентифицируетесь по-разному, вот и все   -  person Don Question    schedule 13.11.2012
comment
Да, @DonQuestion прав. Я просто пытаюсь понять, как работает bind.   -  person David Vasandani    schedule 14.11.2012
comment
Здравствуйте @DavidNeudorfer, вы нашли решение своей проблемы? Я бегу по той же стене...   -  person Marc-Olivier Titeux    schedule 18.06.2013
comment
у меня нет. Пожалуйста, напишите сюда, если найдете ответ.   -  person David Vasandani    schedule 18.06.2013


Ответы (2)


Вы используете разные учетные данные для привязки из командной строки и скрипта Python.

Командная строка использует DN привязки OFFICE\Administrator, в то время как сценарий использует DN привязки cn=Administrator,dc=office,dc=lbox,dc=com.

В Active Directory встроенная учетная запись Administrator не находится на верхнем уровне леса AD, обычно она находится как минимум в Users OU, поэтому DN, который вы вероятно должны использовать, будет : CN=Administrator,CN=Users,dc=office,dc=lbox,dc=com.

Самый простой способ найти подходящую запись для пользователя — это фактически использовать имя учетной записи в поиске из командной строки, например.

ldapsearch -x -b "ou=lunchbox,dc=office,dc=lbox,dc=com" -D "OFFICE\Administrator" -h ad.office.lbox.com -p 389 -W '(samaccountname=Administrator)' dn

и используйте dn, возвращенный из запроса командной строки в вашем коде Python, как dn для привязки.

person Petesh    schedule 06.05.2014

Библиотека python-ldap не анализирует имя пользователя, как и ldapsearch. В своем коде просто используйте то же имя пользователя OFFICE\Administrator и позвольте Active Directory обработать его.

Также ActiveDirectory нередко отказывается от простой привязки через ldap. Вы должны использовать LDAPS. Добавьте эту строку, чтобы обойти проверку сертификата:

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)

Таким образом, весь код может выглядеть так:

#!/usr/bin/env python

import ldap

dn = "OFFICE\Administrator"
pw = "**password**"

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)

con = ldap.initialize('ldaps://ad.office.lbox.com')
con.simple_bind_s( dn, pw )

base_dn = 'ou=lunchbox,dc=office,dc=lbox,dc=com'
filter = '(objectclass=person)'
attrs = ['sn']

con.search_s( base_dn, ldap.SCOPE_SUBTREE, filter, attrs )
person ixe013    schedule 30.04.2015