Récupération de donnée de l'active directory sous access

Soyez le premier à donner votre avis sur cette source.

Vue 13 921 fois - Téléchargée 825 fois

Description

tout est dis dans le titre. De la récupération de donnée en plusieurs parties. Le language de programation sera le VBA. La base de donnée utilisée: AD et access2003.
Je préviens quand même que je suis novice en vba donc si j'y suis arrivé à force d'acharnement tout le monde peut le faire.

Dans cette première partie nous allons récupérer certaines informations utilisateurs.

Prérequis: Base de donnée access avec les tables déjà crée. une table lognames2, elle me permettra de récupérer les informations utilisateurs, avec 6 colonnes:
-logname
-nom
-prenom
-ou
-repperso
-log_fin_prev

une petite modification. On m'a fait remarquer que mes deux sources été sur le même sujet, et de les fusionner, ce que je vais faire.
donc la partie haute sera destiné aux utilisateurs et la partie basse va concernée les groupes de sécurité en général de l'active directory

Prérequis partie groupe: une table groupes2 avec comme colonne:
-Groupe
-DESIGN

dernière modification: à present on récupère aussi les droits utilisateurs

Prérequis droits: une table logname_groupe2 avec comme colonne:
-login
-app_gr

une maquette vous est proposez en zip.

je n'ai plus qu'a vous dire bonne lecture. n'hésitez pas à voter et/ou mettre un commentaire

Source / Exemple :


Option Compare Database
Option Explicit 'plante le programme si une variable n'est pas déclaré
Sub activedir()

'Déclaration des variables
Dim strScope As String, strAttrs As String, strFilter As String, strBase As String, strDomainDN As String
Dim LDAP As String, group As String, login As String, nom As String, mbrf As String
Dim prenom As String, validite As String, expi As String, org As String
Dim tvar() As String
Dim sql As String
Dim mabd As Database
Dim objconn As Object, objRS As Object, objuser As Object
Dim member As Variant

Set mabd = CurrentDb() 'mabd est la base de donnée dans laquel on travaille

strDomainDN = "(le nom de votre domaine)"
strBase = "<LDAP://" & strDomainDN & ">;" 'Définition de l'objet
strFilter = "(&(objectclass=user)(objectcategory=person));" 'Filtre le jeu d'enregistrement afin de garder que les utilisateurs dans l'objet AD
strAttrs = "distinguishedname;" 'Correspond à l'attribut de l'objet que l'on va regarder
strScope = "subtree" 'On pourra rechercher les utilisateurs dans l'arborescence

'Connection à la base
Set objconn = CreateObject("ADODB.Connection") 'Création d'un objet pour la connexion
objconn.Provider = "ADsDSOObject" 'Définition du pilote de connexion
objconn.Open "Active Directory Provider" 'Ouverture de la base

'Validation de la connexion
Set objRS = objconn.Execute(strBase & strFilter & strAttrs & strScope)
objRS.MoveFirst 'Requête d'action sur la recherche.

'Suppression des données existante dans la base.
sql = "delete * from lognames2"
DoCmd.SetWarnings False 'Empêche les fenêtres de confirmation d'apparaitre
DoCmd.RunSQL sql
sql = "delete * from logname_groupe2"
DoCmd.RunSQL sql
sql = "delete * from groupes2"
DoCmd.RunSQL sql
DoCmd.SetWarnings True 'Réactive les fenêtres de confirmation

Do Until objRS.EOF 'Tant que ce ne sera pas le dernier utilisateur trouver la boucle continue
    LDAP = (objRS.Fields(0).Value)  'Obtient le lien LDAP de l'objet trouver
    Set objuser = GetObject("LDAP://" & LDAP & "")

'Les propriétés recherchés de l'objet sont placer dans des variables
    login = (objuser.sAMAccountName)
    prenom = (objuser.givenName)
    nom = (objuser.sn)
    validite = Not (objuser.AccountDisabled)
    expi = objuser.AccountExpirationDate

'Travail dans les données récupérées
    tvar() = Split(LDAP, ",") 'on découpe la variable suivant les virgules et on place chaque morceau dans un tableau
    org = tvar(2) 'on prend la 3 ème case du tableau
    org = Mid(org, 4, Len(org)) ' on découpe les 4 premiers caratères et on place la valeur dans une variable
    If validite = "vrai" Then validite = 1 Else validite = 0 'conversion en donnée numérique
    org = Replace(org, "'", "''") 'on replace les simple quote par de simple quote double, simple quote = erreur
    prenom = Replace(prenom, "'", "''")
    nom = Replace(nom, "'", "''")
    login = Replace(login, "'", "''")
    
    member = objuser.memberof
    On Error Resume Next
    For Each member In objuser.memberof
        tvar() = Split(member, ",")
        mbrf = tvar(0)
        mbrf = Mid(mbrf, 4, Len(mbrf))
        mbrf = Replace(mbrf, "'", "''")

'Insertion des données dans la table logname_groupe2
        sql = "Insert Into logname_groupe2 Values('" & login & "','" & mbrf & "')"
        DoCmd.SetWarnings False
        DoCmd.RunSQL sql
        DoCmd.SetWarnings True
    Next
'Insertion des données dans la table lognames2
    sql = "Insert Into lognames2 Values('" & login & "','" & nom & "','" & prenom & "','" & org & "'," & validite & ",'" & expi & "')"
    DoCmd.SetWarnings False
    DoCmd.RunSQL sql
    DoCmd.SetWarnings True
    objRS.MoveNext
Loop

objRS.MoveFirst

'fin du script pour les utilisateurs et memberof

strFilter = "(&(objectclass=group)(objectcategory=*));" 'Filtre le jeu d'enregistrement
Set objRS = objconn.Execute(strBase & strFilter & strAttrs & strScope)
objRS.MoveFirst 'Requête d'action sur la recherche.

'lancement des recherches et récupération des données dans des variables
Do Until objRS.EOF
    LDAP = (objRS.Fields(0).Value)
    Set objuser = GetObject("LDAP://" & LDAP & "")
    login = (objuser.sAMAccountName)
    
    tvar() = Split(LDAP, ",")
    org = tvar(2)
    org = Mid(org, 4, Len(org))
    org = Replace(org, "'", "''")
    login = Replace(login, "'", "''")
    If org = "groupe" Then org = "global"
    
    sql = "Insert Into groupes2 Values('" & login & "','" & org & "')"
    DoCmd.SetWarnings False
    DoCmd.RunSQL sql
    DoCmd.SetWarnings True
    
    objRS.MoveNext
Loop

'fin du script pour les groupes
mabd.Close
Set objRS = Nothing
Set objconn = Nothing
End Sub

Conclusion :


si vous avez des question n'hésitez pas. et votez pour moi \o/

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
mardi 16 novembre 2010
Statut
Membre
Dernière intervention
28 février 2011

Bonjour,

En Access 2003, j'obteins le message d'erreur suivant à l'exécution de la ligne 46 :

Erreur automation
Le domaine spécifié n'existe pas ou n'a pas pu être contacté

Cela proviendrait-il d'un problème de droit accès au LDAP ?

Merci pour vos réponses.
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
2
Ben typiquement, en ajoutant dans ton code :

'dans la déclaration des variables
Dim ucap as String, phone as string

'dans les propriétés recherchées des utilisateurs
phone = (objuser.telephoneNumber)
ucap = mid(nom,1,1)

'dans la requête sql, je remplace par exemple prenom par phone
sql = "Insert Into lognames2 Values('" & login & "','" & nom & "','" & phone & "','" & org & "'," & validite & ",'" & expi & "')"

Ces simples modifications ne génèrent PAS d'erreur mais la table créée est... vide.

Peux-tu tester chez toi et le cas échéant modifier ton fichier access avec 3 colonnes supplémentaires "phone, mobile, cap" dans la table en adaptant la requête en conséquence? SVP

Merci d'avance
Messages postés
56
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
29 octobre 2010

dans un premier temps, il y a l'option explicit, donc faut définir les variables.
ensuite si tu as des messages d'erreur envoye moi un message ça sera plus simple^^
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
2
Excellente source! Cependant, je n'arrive pas à modifier quoique ce soit dans la DB.

Par exemple, j'aimerais rajouter 3 colonnes dans la table lognames2: je crée donc mes 2 colonnes, je les configure et je paramètre dans la macro les champs correspondants (telephoneNumber et Mobile de l'AD). Résultat: plus aucune donnée ne s'ajoute mais aucun message d'erreur.

Peux-tu m'expliquer comment faire???

p.s.: seul petit bémol à mon sens: arrêter d'utiliser une nomenclature française (nom last et prenom first... ;o)) lol
Messages postés
56
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
29 octobre 2010

merci pour cette remarque. prochaine modification pour les memberof d'ici peu.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.