|
Automatiser l’administrationd’Active Directory via ADSI
I) Introduction
La mission d’ADSI (Active Directory Services Interface) est de vous permettre de scripter le management d’Active Directory (AD en abrégé). L’objet de ce chapitre n’est pas de vous apprendre le fonctionnement d’Active Directory mais de voir comment créer des scripts avec cette interface, de la manipulation d’objets ou conteneurs AD (utilisateur, unité d’organisation, groupes, etc.) jusqu’aux attributs. Nous verrons ensuite l’intérêt du scripting ADSI pour effectuer des recherches dans l’AD.
II) Comment créer un script avec ADSI ?
la création de script avec ADSI est assez facile à appréhender. La méthode générale est la suivante : création d’une connexion à un objet, actions et applications des modifications dans l’AD.
III) Création d’une connexion à un objet
Pour pouvoir agir sur l’AD, il faut d’abord se positionner dans l’annuaire. Par exemple, avant de créer un objet utilisateur dans l’unité d’organisation LesUtilisateurs, il faut tout d’abord se connecter à cette unité d’organisation pour spécifier au système où l’on souhaite créer cet objet. De la même façon, pour modifier un attribut d’un objet utilisateur, il faut se connecter à cet objet. C’est ce qu’on appelle le processus de binding.
Cette connexion se fait en utilisant le chemin au format LDAP de l’objet, ou chemin
complet LDAP de l’objet. Par exemple, pour créer un objet utilisateur dans l’OU LesUtilisateurs du domaine masociete.com, il faut créer une connexion à l’OU en définissant son chemin LDAP complet. Voici comment créer cette connexion :
Set MaConnexion = _ GetObject(« LDAP ://ou=LesUtilisateurs,dc=masociete,dc=com »)
Pour se connecter à l’objet utilisateur cbravo dans cette OU (pour modifier un de ses attributs par exemple), on renseigne le chemin LDAP de l’objet :
Set MonUtilisateur = _ GetObject(« cn=cbravo,ou=LesUtilisateurs,dc=masociete,dc=com)
IV) Un petit mot sur les chemins LDAP
le premier élément à définir est l’objet ou le conteneur visé. Si c’est un objet (utilisateur, ordinateur ou groupe), on précise cn="CNdelobjet" (cn pour Common Name), si c’est une OU, on précise directement ou="nom de l’OU". Ensuite il faut préciser dans quel OU se trouve l’objet, en partant de la dernière sous-OU et en remontant jusqu’à la racine de l’annuaire. Enfin, il faut préciser le nom DNS du domaine dans le sens normal de lecture avec comme référence DC="nom" (DC pour Domain Component), pour chaque référence DNS pointée.
Prenons un exemple clair. Supposons un objet utilisateur cbravo se trouvant dans l’OU suivante :
MASOCIETE.FRANCE.IDF.COM_>PARIS->SCRIPTOVORE->utilisateurs->cbravo
La première chose à faire pour la définition du chemin LDAP, est de renseigner le CN de l’objet utilisateur :
LDAP://cn=cbravo
Pour définir la localisation des OU, nous les prenons en partant de l’OU la plus proche de l’utilisateur, soit :
LDAP://cn=cbravo,ou=utilisateurs,ou=scriptovore,ou=paris
il nous reste à renseigner le domaine.
LDAP://cn=cbravo,ou=utilisateurs,ou=scriptovore,ou=paris, _
dc=masociete,dc=france,dc=idf,dc=com
Notre connexion ADSI se fait donc sous cette forme :
Set MonUtilisateur = GetObject _ ("LDAP://cn=cbravo,ou=utilisateurs,ou=scriptovore,ou=paris, _ dc=masociete,dc=france,dc=idf,dc=com")
V) comment manipuler les objets.
Manipuler les objets Active Directory
Avec ADSI, nous allons pouvoir créer, modifier ou supprimer des objets dans l’annuaire.
VI) Création d’un objet dans l’annuaire
Création d’une OU
Pour créer une OU de premier niveau nous nous connectons directement sur le domaine.
Set MonDomaine = GetObject(("LDAP://dc=masociete,dc=com")
set MonOU = MonDomaine.Create("organizationalUnit", "ou=MaPremiereOU")
MonOU.SetInfo //Pour sauvegarder l’objet dans active directory
Le principe est le même pour toute autre création d’objet :
1 connexion au conteneur ;
2 action de création ;
3 sauvegarde du résultat.
Toutes les modifications sur des objets AD se font dans un cache,es modifications ne deviennent effectives qu’à partir du moment où on utilise la methode SetInfo
Création d’un utilisateur
Set MonOU =GetObject("LDAP://ou=test,dc=medianet,dc=fr")
Set MonUtilisateur = MonOU.Create("user", "cn=ahabert")
MonUtilisateur.Put "sAMAccountName", "ahabert"
MonUtilisateur.SetInfo
Création d’un groupe
Set MonOU = GetObject("LDAP://ou=test,dc=medianet,dc=fr")
Set MonGroupe = MonOU.Create("group", "cn=groupex")
MonGroupe.Put "sAMAccountName", "groupex"
MonGroupe.SetInfo
Suppression d’un objet dans l’annuaire
Suppression d’un objet utilisateur
Set MonOU = GetObject ("LDAP://ou=test,dc=medianet,dc=fr")
MonOU.Delete "user" , "cn=ahabert"
Suppression d’un groupe
Set MonOU = GetObject("LDAP://ou=test,dc=medianet,dc=fr")
MonOU.Delete "group", "cn=groupex"
Suppression d’une OU
si l’OU contient des objets, il faut d’abord supprimer l’ensemble des objets qu’elle contient
Set MonDomaine = GetObject("LDAP://dc=medianet,dc=fr")
MonDomaine.Delete "organizationalUnit", "ou=test"
Multiplier les créations ou les suppressions
Création d’un fichier utilisateur utilisateurs.txt
user1
user2
user3
user4
user5
Set objFSO = CreateObject("Scripting.FileSystemObject")
set objListe = objFSO.OpenTextFile("utilisateurs.txt")
Set MonOU = GetObject("LDAP://ou=test,dc=medianet,dc=fr")
Do Until objListe.AtEndOfStream
NomUtilisateur = objListe.Readline
set MonUtilisateur = MonOU.Create("user" , "cn =" & NomUtilisateur)
MonUtilisateur.put "sAMAccountName" , NomUtilisateur
MonUtilisateur.SetInfo
Loop
Travailler avec les attributs des objets
Lecture d’attributs d’un objet
Set MonUtilisateur = GetObject("LDAP://cn=user1,ou=test,dc=medianet,dc=fr")
MonUtilisateur.Get("description")
wscript.echo MonUtilisateur.Get("description")
Modification d’attributs d’un objet
Set MonUtilisateur = GetObject("LDAP://cn=user1,ou=test,dc=medianet,dc=fr")
MonUtilisateur.Put "description", "Un utilisateur sympathique"
Monutilisateur.SetInfo
MonUtilisateur.Get("description")
wscript.echo MonUtilisateur.Get("description")
Set MonUtilisateur = GetObject("LDAP://cn=user1,ou=test,dc=medianet,dc=fr")
MonUtilisateur.Put "description", "Un utilisateur sympathique"
MonUtilisateur.Put "telephoneNumber", "0160603535"
MonUtilisateur.Put "mail" , "
Cette adresse email est protégée contre les robots des spammeurs, vous devez activer Javascript pour la voir.
"
Monutilisateur.SetInfo
description=MonUtilisateur.Get("description")
telephone=MonUtilisateur.Get("telephonenumber")
mail=MonUtilisateur.Get("mail")
chaine=description & telephone & mail
wscript.echo chaine
Gérer les attributs à plusieurs valeurs
Certains attributs retournent plusieurs valeurs, par exemple les membres d’un groupe
Lecture d’attributs à plusieurs valeurs
GetEx : Cette méthode génère une collection avec les valeurs retournées
Cette collection va pouvoir être exploitée avec une boucle d’itération de collection
Set objGroupe = GetObject("LDAP://cn=groupex,ou=test,dc=medianet,dc=fr")
LesMembres = objGroupe.GetEx("member")
For Each Member in LesMembres
Wscript.Echo Member
Next
Écriture d’attributs à plusieurs valeurs
méthode PutEx pour renseigner des attributs multivaleurs
objet.PutEx MethodeDeMAJ, AttributaModifier, Array("valeur1","valeur2"...)
MethodeDeMAJ : il y a quatre méthodes de mise à jour avec PutEx, représentées par une valeur numérique.
|
1
|
Efface toutes les entrées.
|
|
2
|
Remplace les entrées.
|
|
3
|
Modifie une ou plusieurs entrées.
|
|
4
|
Supprime une ou plusieurs entrées.
|
AttributaModifier : l’attribut à modifier
Array : la collection de valeurs à ajouter ou à modifier. Pour supprimer l’ensemble des valeurs, utiliser le paramètre 1. Pour effacer toutes les entrées, utiliser 0 pour ce paramètre.
Effacer toutes les valeurs inscrites dans un attribut
Set objGroupe = GetObject("LDAP://cn=groupex,ou=test,dc=medianet,dc=fr")
objGroupe.PutEx 1,"member", 0
objGroupe.SetInfo
Utiliser PutEx pour l’effacement des attributs à valeur unique
Remplacer les entrées
Set objGroupe = GetObject("LDAP://cn=groupex,ou=test,dc=medianet,dc=fr")
objGroupe.PutEx 2,"member", Array("cn=user1,ou=test,dc=medianet,dc=fr")
objGroupe.SetInfo
Modifier une ou plusieurs entrées
Set objGroupe = GetObject("LDAP://cn=groupex,ou=test,dc=medianet,dc=fr")
objGroupe.PutEx 3,"member", Array("cn=user1,ou=test,dc=medianet,dc=fr")
objGroupe.SetInfo
Effacer une ou plusieurs entrées
Set objGroupe = GetObject("LDAP://cn=groupex,ou=test,dc=medianet,dc=fr")
objGroupe.PutEx 4,"member",Array("cn=user1,ou=test,dc=medianet,dc=fr")
objGroupe.SetInfo
Les opérations avec plusieurs entrées : La méthode est la même, il suffit de mettre plusieurs éléments dans les collections (Array).
Effectuer une suite d’opérations sur un objet Enfin, si vous vouez faire plusieurs opérations de suite sur un objet, comme effacer puis ajouter un élément, il faut impérativement faire un SetInfo entre les commandes pour qu’elles soient prises en compte (sinon, seule la dernière commande sera appliquée).
Faire des recherches dans Active Directory
Nous allons pouvoir faire des recherches par une technologie de recherche nommée ActiveX Data Object (ADO). ADO propose le fournisseur ADSI OLE DB pour lire des informations dans Active Directory (il existe d’autres interfaces OLE DB pour gérer toutes sortes de bases de données, mais nous nous intéressons ici uniquement à Active Directory et l’interface de requête pour ADSI).
Les informations retournées par cette interface sont en lecture seule, il ne va donc pas être possible de l’utiliser pour écrire dans AD. Mais nous allons pouvoir utiliser le scripting ADSI pour exploiter les informations retournées par la requête ADSI OLE DB.
Articulation d’une requête Active Directory avec ADSI
LES ETAPES
1 création d’un objet de connexion ADO ;
2 ouvertures du fournisseur ADSI OLE DB ;
3 créations d’un objet Command ;
4 spécifications de la connexion active ;
5 affecter le contenu de notre commande à l’objet Command préalablement instancié ;
6 exécuter la requête avec la méthode Exécute de l’objet Command ;
7 créations d’une boucle pour traiter les résultats.
Set objetConnexion = CreateObject("ADODB.Connection")
objetConnexion.Open "Provider=ADsDSOObject;"
Set objetCommande = CreateObject("ADODB.Command")
objetCommande.ActiveConnection = objetConnexion
Affecter le contenu de notre commande à l’objet Command préalablement instancié
objetCommande.CommandText = _"<Base de Recherche>;(ObjetCategory=TypeDobjet);Attribut;ChampDeRecherche"
<Base de Recherche> : chemin LDAP d’où doit démarrer la recherche dans l’arborescence. Par exemple, pour une requête sur tout le domaine masociete.com, ce paramètre serait: <LDAP://dc=masociete,dc=com>. Pour une requête commençant par l’OU Poitou, OU de premier niveau du domaine : <LDAP://ou=Poitou, dc=masociete,dc=com>.
(ObjetCategory=TypeDobjet) : sert à limiter la recherche à un type d’objet spécifique (utilisateur, groupe, ordinateur).
TypeDobjet : peut être group, user, computer, OrganisationalUnit. Ce paramètre est optionnel, vous pouvez ne pas le renseigner (laissez par contre les points virgules comme ceci : <baserecherche>;;attribut;champ.
Attribut : le ou les attributs à retourner par la requête. Pour en spécifier plusieurs, séparez-les par une virgule.
ChampDeRecherche : permet de spécifier si la requête se limite au niveau de la base
de recherche, ou si elle doit descendre aux sous-OU.
Pour effectuer une requête à un seul niveau, spécifier onelevel ; pour parcourir tousles sous-niveaux, spécifier subtree.
EXEMPLE
nous voulons retrouver le nom de tous les objets contenus dans l’OU test et ses sous-OU, quel que soit le type d’objet :
Set objetConnexion = CreateObject("ADODB.Connection")
objetConnexion.Open "Provider=ADsDSOObject;"
Set objetCommande = CreateObject("ADODB.Command")
objetCommande.ActiveConnection = objetConnexion
objetCommande.CommandText ="<LDAP://ou=test,dc=medianet,dc=fr>;;name;subtree"
Set objEnregistrement = objetCommande.Execute
Do Until objEnregistrement.EOF
wscript.echo objEnregistrement.Fields("name")
objEnregistrement.MoveNext
Loop
objetConnexion.Close
nom de tous les groupes contenus dans l’OU test et ses sous-OU dans le domaine medianet.fr :
|