Jump to content

[SERVEUR] Requête LDAP pour MAJ fiche utilisateur AD


ggbce

Recommended Posts

Bonjour,

J'ai un petit problème où je ne sais pas trop comment m'y prendre. Je fait souvent des scripts VBS pour exécuter des tâches récurrentes et là je dois en faire un qui interagit avec Active Directory.

Pour ce qui est de faire une recherche en lecture, pas de problème (pour trouver une information dans AD). Là où j'ai un problème, c'est d'aller écrire, plus précisément comment sélectionner correctement le bon utilisateur dans lequel je veux écrire.

Je vais faire mon exemple sur l'alimentation d'un seul champ pour que vous compreniez bien. Disons que je voudrais ajouter le numéro d'employé (EmployeeNumber).

1- La première chose est de demander à la personne quel utilisateur il veut modifier. Je pose la question en demandant le compte Windows (sAMAccoutname) dans un InputBox. Pas de problème à ce niveau :transpi:

2- La deuxième étape est de faire une recherche dans Active Directory pour savoir si ce compte existe. Pas de problème non plus à ce niveau.

3- J'affiche à la personne la fiche de l'utilisateur pour être certain qu'il veut modifier le bon compte. Pas de problème non plus à ce niveau.

4- J'ouvre un nouveau InputBox demandant le numéro d'employé qu'il veut spécifier.

5- Je veux écrire la valeur dans le champ EmployeeNumber de la fiche de cet utilisateur dans Active Directory. Je n'ai pas de problème pour déterminer le champ, ni la méthode pour écrire... mais je ne comprend pas comment déterminer l'utilisateur de destination (où je veux écrire).

---------

J'ai trouvé plein d'exemple sur internet qui explique avec une requête LDAP dans laquelle le nom de l'utilisateur, le OU, le domaine, etc sont définis "statiquement"... pas très pratique lorsque ton annuaire Active Directory contient une bonne vingtaine de OU différents pour trier les utilisateurs. Lorsque je fais une recherche, c'est simple car je peux définir la racine de l'AD et lui dire de chercher partout dans les sous-branches (subtree). Mais cette méthode ne semble pas possible en écriture.

Voici mon script:

' ***********************************************************************
' MAJ numéro d'employé
' Par: GGBCE
' Date: 7 décembre 2010
' ***********************************************************************


' Demande le nom d'usager Windows à vérifier
strUser = InputBox("Tapez le nom de l'utilisateur que vous voulez ajouter le numéro d'employé (sans le domaine), ex.: ggbce01")


' Détecte le nom DNS du domaine par défaut automatiquement (RootDSE)
Set objRootDSE = GetObject("LDAP://RootDSE")
strDomain = objRootDSE.Get("defaultNamingContext")

' Détermine que AdoCommand sera utilisé pour les commande ADODB
Set AdoCommand = CreateObject ("ADODB.Command")

' Détermine que AdoConnection sera utilisé pour les connexions ADODB
Set AdoConnection = CreateObject("ADODB.Connection")

' Détermine le fournisseur de connexion ADODB
AdoConnection.Provider = "ADsDSOObject"

' ouverture de connexion
AdoConnection.Open "Active Directory Provider"

' Active la connexion
Set AdoCommand.ActiveConnection = AdoConnection

' Requête de recherche depuis une valeur inscrite dans la variable strUser récupérée dans le InputBux au début.
AdoCommand.CommandText = "<LDAP://" & strDomain & ">;(&(objectCategory=person)(objectClass=user)(sAMAccountName=" & strUser & "));sAMAccountName,cn,name,employeeNumber;subtree"

'Créé la commande d'exécution
Set AdoRecordSet = AdoCommand.Execute

' Exécute la commande en boucle pour sortir tous les résultats possibles
Do Until AdoRecordSet.EOF
'Place les valeurs en variable pour un utilisateur
strName = AdoRecordset.Fields("sAMAccountName").Value
strCN= AdoRecordset.Fields("cn").Value
strEN= AdoRecordset.Fields("employeeNumber").Value

' Affiche pour un utilisateur
WScript.Echo "Nom Windows:" & strName & ", nom visuel:" & strCN & ", numéro d'employé actuel:" & strEN

       ' *** ICI J'AI SAUTÉ VOLONTAIREMENT LES IF et   
       ' question si l'utilisateur veux continuer ou non 
       ' pour alléger le code que je vous envoi.

' Demande le nouveau numéro d'employé
strEmployeeNumber = InputBox("Tapez le numéro d'employé à mettre à jour:")

'Const ADS_PROPERTY_UPDATE = 2

' ******* C'EST CETTE LIGNE CI-DESSOUS QUI ME POSE PROBLÈME, comment faire pour   
       ' ******** déterminer le bon emplacement ******
Set objUser = GetObject ("LDAP://cn=" & user & ", OU=" & MonOUetSousOU & "," & strDomain & ")
objUser.Put "EmployeeNumber", " & strEmployeeNumber & "
objUser.SetInfo

' Passe au prochain objet trouvé
AdoRecordSet.MoveNext
Loop

Wscript.Echo "Fin"

Link to comment
Share on other sites

Salut, j'ai mis en gras 2-3 trucs... Pour obtenir le DN, je pense que ça peut servir pour mettre a jour le champ que tu souhaites !

edit : mince cela ne mets pas du gras dans du code dommage :/


' Requête de recherche depuis une valeur inscrite dans la variable strUser récupérée dans le InputBux au début.
AdoCommand.CommandText = "<LDAP://" & strDomain & ">;(&(objectCategory=person)(objectClass=user)(sAMAccountName=" & strUser & "));sAMAccountName,cn,name,employeeNumber[b],distinguishedName[/b];subtree"

'Créé la commande d'exécution
Set AdoRecordSet = AdoCommand.Execute

' Exécute la commande en boucle pour sortir tous les résultats possibles
Do Until AdoRecordSet.EOF
'Place les valeurs en variable pour un utilisateur
strName = AdoRecordset.Fields("sAMAccountName").Value
strCN= AdoRecordset.Fields("cn").Value
strEN= AdoRecordset.Fields("employeeNumber").Value
       [b]strDN= AdoRecordset.Fields("distinguishedName").Value[/b]


[b]	dans strDN tu obtiens CN=nomdutilisateur,OU=1ere OU,OU=2eme OU,OU=3eme OU (...),DC=nomdedomaine,DC=fr ...[/b]
[...]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...