2011-01-24 43 views
14

Quiero ejecutar la consulta siguiente en el LDAPconsulta LDAP en Python

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 el uso de las variables obtenidas de este modo. ¿Cómo puedo hacer eso?

Respuesta

8

Es posible que desee para el módulo "ldap". El código serí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 
+7

Necesita 'apt-get install python-ldap' antes de que esto funcione. – 9000

+18

¿Estoy loco, o esto no responde la pregunta? Está preguntando cómo ejecutar una consulta, y le estás mostrando cómo enlazar. –

+0

@mehasse: El ejemplo fue diseñado para mostrar el uso común del módulo ldap, que creo que sí. Si intenta hacer una consulta, puede usar el método .search en el objeto ldap. – Claris

0

puede utilizar el módulo de comandos, y la 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 

usted tiene que tener binaria ldapsearch Instalada en su sistema.

regards.-

+5

Usar comandos, cuando hay una biblioteca de Python nunca es una buena idea. – jdborg

+0

Algunas empresas usan comandos de TI personalizados para la interacción interna con la infraestructura, se puede requerir que uno use dichos comandos para evitar recibir una visita de la unidad de cumplimiento de TI. "Nunca digas nunca". – qneill

2

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

El ldap_server es el objeto que obtiene de ldap.initialize(). Es probable que deba vincularse antes de llamar a esta función, también, dependiendo del servidor LDAP que esté utilizando y de lo que esté intentando consultar. El base_dn y filter_ son similares a los que tienes en tu versión de línea de comando. El limit es la cantidad máxima 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 

Por favor, tenga en cuenta que la interpolación de los valores proporcionados por el usuario en su consulta LDAP es peligroso! Es una forma de inyección que permite a un usuario malintencionado cambiar el significado de la consulta. Ver: http://www.python-ldap.org/doc/html/ldap-filter.html

25

Si bien la respuesta aceptada de hecho muestra una forma adecuada de vincularse a un servidor LDAP, creo que no respondió la pregunta de manera integral. Esto es lo que terminé implementando para tomar el correo y el departamento de un usuario. Esto de alguna manera combina 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() 
+4

Mejor usuario 'search_s()' para evitar el 'while 1' – Caumons

+0

Para completar @Caumons comment; para evitar el uso mientras hago 1: 'res = l.search_s (basedn, searchScope, searchFilter, searchAttribute)' 'print res' ' l.unbind_s() ' –

Cuestiones relacionadas