ggbce Posté(e) le 8 décembre 2010 Partager Posté(e) le 8 décembre 2010 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 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" Lien vers le commentaire Partager sur d’autres sites More sharing options...
sylecomte Posté(e) le 9 décembre 2010 Partager Posté(e) le 9 décembre 2010 Salut ! Euh ça fait un moment que j'ai pas fait de vbs... mais si tu récupères le DN (distinguishedName), ça va pas de donner l'emplacement exact ou tu veux faire ta modif ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
sylecomte Posté(e) le 9 décembre 2010 Partager Posté(e) le 9 décembre 2010 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] [...] Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.