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 utiliser les variables ainsi obtenu. Comment puis-je le faire?

17
demandé sur guerda 2011-01-24 20:04:22

4 réponses

Vous voulez probablement nous l' "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
8
répondu Claris 2014-03-07 22:47:07

alors que la réponse acceptée montre en fait une bonne façon de se lier à un serveur LDAP, je pense qu'elle n'a pas répondu à la question de façon holistique. Voici ce que j'ai fini par mettre en œuvre pour saisir le courrier et le service d'un utilisateur. Il s'agit là d'un amalgame entre les attributs requis et 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()
34
répondu Dan 2015-03-05 14:52:29

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

ldap_server est l'objet que vous obtenez de ldap.initialiser.)( Vous aurez probablement besoin de bind avant d'appeler cette fonction, aussi, en fonction du serveur LDAP que vous utilisez et de ce que vous essayez de rechercher. base_dn et filter_ sont similaires à ce que vous avez dans votre version en ligne de commande. limit est le nombre maximum d'enregistrements retourné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

s'il vous Plaît gardez à l'esprit que l'interpolation les valeurs fournies par l'utilisateur dans votre requête LDAP sont dangereuses! C'est une forme d'injection qui permet à un utilisateur malveillant de modifier la signification de la requête. Voir: http://www.python-ldap.org/doc/html/ldap-filter.html

2
répondu Mark E. Haase 2017-02-07 18:33:59

Vous pouvez utiliser le module commandes, et la sortie 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 avoir ldapsearch binaire installé dans votre système.

cordialement.-

0
répondu pepo 2011-01-24 18:08:03