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