Fil RSS

Accéder à Active Directory avec Python

7

mars 1, 2013 par Kaluche, 1 717 vues

memes python Accéder à Active Directory avec Python

 

Python-ldap est une API  permettant l’accès à votre annuaire LDAP avec un script Python. Rien de nouveau, c’est connu, mais c’est vraiment pratique et très puissant. L’objectif que je m’étais fixé était de pouvoir stocker dans une liste tous les membres d’un groupe de l’AD, sans doublon, et en détaillant les membres des groupes inclus dans groupes … Bref, tout bêtement du récursif. Si ça intéresse quelqu’un, qu’il le demande ;). Le script ci-dessous permet simplement d’afficher les informations d’un utilisateur. Une fois que vous avez ceci, vous pouvez tout faire très simplement, ça coule de source. A noter que j’ai utilisé python2.7 et python-ldap2.4.10.

# -*- coding: iso-8859-1 *-*
import ldap

ldap.set_option(ldap.OPT_REFERRALS, 0) # Nécessaire chez moi pour éviter le INVALID CREDENTIALS lors du binding

def search_by_samaccount(samaccount):
 con = ldap.initialize("ldap://MONDOMAIN:389") # Remplacez par votre domaine...
 con.simple_bind('MON_ID@MONDOMAIN','MON_PASSWORD')  # Username et password
 base_filter = 'DC=MON,DC=DOMAIN,DC=FR' # Le base filter, ici on cherche à partir de la racine
 search_filter = 'sAMAccountName='+samaccount # Le filtre de recherche
 search_attr = None # Le filtre d'attribut à récupérer. Par exemple, search_attr = ['displayName']. None = No filtre
 search_result = con.search_s(base_filter,ldap.SCOPE_SUBTREE,search_filter,search_attr)
 i = 0
 try:
  for i in range(len(search_result)-4): # Pour chaque personne trouvée, on affiche quelques infos
   print " \n *******************************************\n"
   #print search_result[i] pour afficher tous les attributs
   print search_result[i][1]['sAMAccountName']
   print search_result[i][1]['distinguishedName']
   print search_result[i][1]['displayName']
   print search_result[i][1]['memberOf']
   i = i + 1
 except TypeError,error:
  print error
 con.unbind() # Unbind de la connexion

if __name__ =='__main__':
 sam_input = raw_input("sAMAccountName please ? ")
 search_by_samaccount(sam_input)

 

EDIT :

Alors, en speed, voilà une ébauche de ce que tu peux faire pour afficher les membres d’un groupe + les membre du groupe de ce groupe … C’est largement optimisable (variable, mise en forme, etc…) mais ça a le mérite de fonctionner ! Idéalement, j’aurais ajouté une interface graphique qui listerai (sans doublons) les utilisateurs d’un groupe, en le(s) renseignant dans une ch’tite textbox … Je vous laisse faire mumuse !

# -*- coding: iso-8859-1 *-*
import ldap
ldap.set_option(ldap.OPT_REFERRALS, 0)

#La fonction de recherche des membres d'un groupe
def search_group_member(samaccount):
 con = ldap.initialize("ldap://MONDOMAIN:389")
 con.simple_bind('MON_ID@MONDOMAIN','MON_PASSWORD')
 base_filter = 'DC=MON,DC=DOMAIN,DC=FR'
 search_filter = 'sAMAccountName='+samaccount
 search_attr = None
 search_result = con.search_s(base_filter,ldap.SCOPE_SUBTREE,search_filter,search_attr)
 print "GROUPE : ",search_result[0][1]['sAMAccountName']
 i = 0
 try:
  for i in range(len(search_result[0][1]['member'])):
   dn = search_result[0][1]['member'][i]
   print "MEMBRE ",i," : ",
   print search_sam_by_dn(con,dn)
   i = i + 1
 except TypeError,error:
  print error
 con.unbind()

#La fonction de recherche du displayName d'un user grâce
#au DN obtenu dans l'attribut "member" d'un groupe
def search_sam_by_dn(connexion,dn_user):
 base_filter = 'DC=MON,DC=DOMAIN,DC=FR'
 search_f = 'distinguishedName='+dn_user
 search_a = ["cn","objectCategory","displayName","sAMAccountName"]
 search_result = connexion.search_s(base_filter,ldap.SCOPE_SUBTREE,search_f,search_a)
 objectCategory = search_result[0][1]['objectCategory']
 if (objectCategory[0] == "CN=Group,CN=Schema,CN=Configuration,DC=mon,DC=domain,DC=fr"):
  search_group_member(search_result[0][1]['sAMAccountName'][0])
 else:
  return search_result[0][1]['displayName']

list_gr = ["Admins du domaine","Administrateurs DHCP"]
x = 0
for x in range(len(list_gr)):
 search_group_member(list_gr[x])
 print
 print "\n******************************************\n"
 x = x + 1

7 commentaires »

  1. Rancho dit :

    Bonjour, je ne trouve pas ton mail pour te contacter, je suis fortement intéressé par ton code en entier qui contient aussi la consultation des différents groupes etc..

    Merci par avance

    Bonne journée

  2. Rancho dit :

    Ou si quelqun’un a un code équivalent qui permet de chercher un groupe du AD et de pouvoir lister les membres qui sont dedans, mon adresse est oxak4@hotmail.com si vous pouviez m’envoyer un code correspondant.

    Merci par avance de votre aide

    Bonne journée

    Rancho

  3. Rancho dit :

    Re bonjour si quelqu’un a un code python relatif à celui-ci et compléter avec une recherche de groupe, lister les utilisateurs qui sont dedans, autres.. et peut me le transmettre sur oxak4@hotmail.com je suis preneur !!!

    Merci d’avance

    Rancho

  4. Rancho2 dit :

    Je ne peux pas réécrire un deuxieme commentaire à la suite, donc juste pour dire que mon adresse mail est oxak4@hotmail.com si quelqu’un a un code similaire, qui permet en python une fois connecté faire des recherches par rapport au groupe .. je suis preneur !!! help plz

    cordialement,

    Rancho

  5. Kaluche dit :

    Désolé du retard, j’avais zappé ton premier mail ! Je te tiens au jus au plus tard vendredi !

    A+

  6. Kaluche dit :


    Rancho2:

    Je ne peux pas réécrire un deuxieme commentaire à la suite, donc juste pour dire que mon adresse mail est oxak4@hotmail.com si quelqu’un a un code similaire, qui permet en python une fois connecté faire des recherches par rapport au groupe .. je suis preneur !!! help plz
    cordialement,
    Rancho

    C’est edit, désolé du retard !

  7. Rancho2 dit :

    Merci beaucoup kaluche !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>