Запрос LDAP в python
Я хочу выполнить следующий запрос в ldap
ldapsearch -h hostname -b dc=ernet,dc=in -x "(&(uid=w2lame)(objectClass=posixAccount))" gidnumber
ldapsearch -h hostname -b dc=ernet,dc=in -x "(&(gidNumber=1234)(objectClass=posixGroup))" cn
И используйте полученные таким образом переменные. Как я могу это сделать?
Ответы
Ответ 1
Вероятно, нам нужен "ldap" . Код выглядит примерно так:
import ldap
l = ldap.initialize('ldap://ldapserver')
username = "uid=%s,ou=People,dc=mydotcom,dc=com" % username
password = "my password"
try:
l.protocol_version = ldap.VERSION3
l.simple_bind_s(username, password)
valid = True
except Exception, error:
print error
Ответ 2
Хотя принятый ответ действительно показывает правильный способ привязки к LDAP-серверу, я чувствую, что он не ответил на вопрос целостно. Вот что я в конечном итоге реализовал, чтобы захватить почту и отдел пользователя. Это несколько смешивает требуемые атрибуты с исходным вопросом.
l = ldap.initialize('ldap://ldap.myserver.com:389')
binddn = "cn=myUserName,ou=GenericID,dc=my,dc=company,dc=com"
pw = "myPassword"
basedn = "ou=UserUnits,dc=my,dc=company,dc=com"
searchFilter = "(&(gidNumber=123456)(objectClass=posixAccount))"
searchAttribute = ["mail","department"]
#this will scope the entire subtree under UserUnits
searchScope = ldap.SCOPE_SUBTREE
#Bind to the server
try:
l.protocol_version = ldap.VERSION3
l.simple_bind_s(binddn, pw)
except ldap.INVALID_CREDENTIALS:
print "Your username or password is incorrect."
sys.exit(0)
except ldap.LDAPError, e:
if type(e.message) == dict and e.message.has_key('desc'):
print e.message['desc']
else:
print e
sys.exit(0)
try:
ldap_result_id = l.search(basedn, searchScope, searchFilter, searchAttribute)
result_set = []
while 1:
result_type, result_data = l.result(ldap_result_id, 0)
if (result_data == []):
break
else:
## if you are expecting multiple results you can append them
## otherwise you can just wait until the initial result and break out
if result_type == ldap.RES_SEARCH_ENTRY:
result_set.append(result_data)
print result_set
except ldap.LDAPError, e:
print e
l.unbind_s()
Ответ 3
Вот пример генератора для python-ldap.
ldap_server
- это объект, который вы получаете из ldap.initialize(). Вам, вероятно, потребуется связать и до вызова этой функции, в зависимости от того, какой сервер LDAP вы используете, и чего вы пытаетесь запросить. base_dn
и filter_
похожи на то, что у вас есть в вашей версии командной строки. limit
- максимальное количество возвращенных записей.
def _ldap_list(ldap_server, base_dn, filter_, limit=0):
""" Generator: get a list of search results from LDAP asynchronously. """
ldap_attributes = ["*"] # List of attributes that you want to fetch.
result_id = ldap_server.search(base_dn, ldap.SCOPE_SUBTREE, filter_, ldap_attributes)
records = 0
while 1:
records += 1
if limit != 0 and records > limit:
break
try:
result_type, result_data = ldap_server.result(result_id, 0)
except ldap.NO_SUCH_OBJECT:
raise DirectoryError("Distinguished name (%s) does not exist." % base_dn)
if result_type == ldap.RES_SEARCH_ENTRY:
dn = result_data[0][0]
data = result_data[0][1]
yield dn, data
else:
break
Имейте в виду, что интерполяция предоставляемых пользователем значений в ваш запрос LDAP опасна! Это форма инъекции, которая позволяет злоумышленнику изменять смысл запроса. См.: http://www.python-ldap.org/doc/html/ldap-filter.html
Ответ 4
вы можете использовать модуль команд, а getoutput - проанализировать результат запроса ldap:
from commands import getoutput
result = getoutput('ldapsearch -h hostname -b dc=ernet,dc=in -x "(&(uid=w2lame)(objectClass=posixAccount))"')
print result
у вас должен быть установлен ldapsearch двоичный файл в вашей системе.
С уважением.-