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