libreria python ldap ldap-query

libreria - Consulta LDAP en python



libreria ldap python (4)

Aquí hay un generador de ejemplo para python-ldap.

El ldap_server es el objeto que obtiene de ldap.initialize (). Es probable que también deba vincularse antes de llamar a esta función, según el servidor LDAP que esté utilizando y lo que esté intentando consultar. filter_ y filter_ son similares a lo que tienes en tu versión de línea de comandos. El limit es el número máximo de registros devueltos.

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

¡Tenga en cuenta que la interpolación de valores proporcionados por el usuario en su consulta LDAP es peligrosa! Es una forma de inyección que permite a un usuario malintencionado cambiar el significado de la consulta. Consulte: http://www.python-ldap.org/doc/html/ldap-filter.html

Quiero ejecutar la siguiente consulta en el 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

Y utilizar las variables así obtenidas. ¿Cómo puedo hacer eso?


Probablemente nos quieras el módulo "ldap" . El código se vería algo así como:

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


Si bien la respuesta aceptada muestra de hecho una forma adecuada de vincularse a un servidor LDAP, siento que no respondió la pregunta de manera integral. Esto es lo que terminé implementando para obtener el correo y el departamento de un usuario. Esto combina de alguna manera los atributos requeridos de la pregunta original.

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()


puede usar el módulo de comandos y el comando getoutput para analizar el resultado de la consulta ldap:

from commands import getoutput result = getoutput(''ldapsearch -h hostname -b dc=ernet,dc=in -x "(&(uid=w2lame)(objectClass=posixAccount))"'') print result

tienes que tener instalado ldapsearch binary en tu sistema.

Saludos.-