web-dev-qa-db-fra.com

Requête LDAP en python

Je veux exécuter la requête suivante dans le 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

Et utilisez les variables ainsi obtenues. Comment puis je faire ça?

17
w2lame

Vous voulez probablement nous le "ldap" module. Le code ressemblerait à quelque chose comme:

    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
9
Claris

Bien que la réponse acceptée indique en fait un moyen approprié de se connecter à un serveur LDAP, j’ai le sentiment qu’elle n’a pas répondu à la question de manière globale. Voici ce que j'ai fini par mettre en œuvre pour récupérer le courrier et le service d'un utilisateur. Cela mélange un peu les attributs requis de la question initiale.

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

Voici un exemple de générateur pour python-ldap. 

Le ldap_server est l’objet que vous obtenez de ldap.initialize (). Vous aurez probablement besoin de vous lier avant d'appeler cette fonction également, en fonction du serveur LDAP que vous utilisez et de l'objet de la requête. Le base_dn et le filter_ sont similaires à ce que vous avez dans votre version en ligne de commande. limit est le nombre maximum d'enregistrements renvoyés.

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

N'oubliez pas qu'il est dangereux d'interpoler les valeurs fournies par l'utilisateur dans votre requête LDAP! C'est une forme d'injection qui permet à un utilisateur malveillant de changer le sens de la requête. Voir: http://www.python-ldap.org/doc/html/ldap-filter.html

2
Mark E. Haase

vous pouvez utiliser le module de commandes et getoutput pour analyser le résultat de la requête LDAP:

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

vous devez installer le binaire ldapsearch dans votre système.

cordialement.-

0
pepo