Cet article vous expliquera comment utiliser VB.NET pour effectuer les manipulations les plus courantes sur Active Directory (listage des utilisateurs, ajout, modification).
JE. Introduction
L'interaction entre VB.NET et Active Directory est de plus en plus courante. De nombreuses entreprises et particuliers recherchent
de les utiliser pour développer des applications de toutes sortes.
Cet article explique les principales tâches que vous pouvez effectuer à l'aide de VB.NET et d'Active Directory : lister les informations utilisateur,
ajouter un utilisateur, modifier un utilisateur, etc.
II. Introduction à Active Directory
Avant de commencer à parler de codage, jetons un coup d'œil à Active Directory, afin de comprendre de quoi il s'agit.
Active Directory est le service d'annuaire de Microsoft Windows 2000.
Il permet de gérer les ressources du réseau : données utilisateur, imprimantes, serveurs, base de données, groupes, ordinateurs.
et les politiques de sécurité.
Les utilisateurs n'ont pas à se soucier de la structure physique du réseau pour accéder à ces ressources.
Active Directory simplifie l'administration du réseau en permettant l'accès à toutes ces ressources à partir d'un seul point
de l'administration. Les autres avantages sont une structure hiérarchique flexible et une évolutivité qui permet le stockage
de millions de ressources.
Pour vous connecter à l'Active Directory, vous devez utiliser le protocole de connexion LDAP (Lightweight Directory Access Protocol),
qui est un protocole de gestion d'annuaire réseau.
III. Active Directory et Visual Studio
Avant de pouvoir utiliser les objets nécessaires pour manipuler Active Directory, vous devez ajouter une référence dans Visual Studio :
System.DirectoryServices.dll
Pensez ensuite à ajouter la référence dans les clauses using, en faisant :
Ajout de l'espace de noms System.DirectoryServices
Imports System.DirectoryServices
Une fois que vous avez fait cela, vous pouvez passer à la partie de codage proprement dite et ainsi commencer par vous connecter à Active Directory.
IV. Connexion à Active Directory
La connexion à un Active Directory est très simple, sans doute la partie la plus simple du codage.
Pour vous connecter à Active Directory, vous devez utiliser l'objet DirectoryEntry.
Le constructeur de cet objet prend trois chaînes de caractères en paramètres :
.le chemin d'accès à l'Active Directory (également appelé AD) : ce chemin est de la forme : LDAP://votre-nom-AD ;
.le nom d'utilisateur pour la connexion (l'utilisateur doit faire partie de l'AD) ;
.le mot de passe correspondant.
Vous devriez donc avoir quelque chose comme ceci :
Connectez-vous à l'Active Directory
try
Dim Ldap As DirectoryEntry = new DirectoryEntry("LDAP://your-AD-name", "Login", "Password")
Catch Ex As Exception
MessageBox.Show(Ex.Message)
End try
Si aucune erreur n'est détectée par la clause Catch, cela signifie que vous êtes connecté avec succès à Active Directory.
Vous pouvez donc passer à la suite de l'article, c'est à dire au listing des utilisateurs Active Directory.
V. Liste des utilisateurs
Pour lister les utilisateurs présents dans Active Directory, le principe est simple : on parcourt l'AD et à chaque fois que l'on rencontre un objet de type utilisateur, on affiche l'information souhaitée. C'est la théorie, passons maintenant à la pratique !
Pour rechercher AD, vous devez utiliser l'objet DirectorySearcher.
Dim Ldap As DirectoryEntry = new DirectoryEntry("LDAP://your-AD-name", "Login", "Password")
Dim searcher As DirectorySearcher = New DirectorySearcher (Ldap)
Next, you need to specify a search filter, using the Filter property. In our case, we only want users, so we write:
Filtering on users
searcher.Filter = "(objectClass=user)"
L'objet DirectorySearcher dispose de deux méthodes principales de recherche :
FindOne(), qui renverra le premier objet correspondant aux critères de recherche ;
FindAll(), qui renvoie tous les enregistrements correspondant aux critères de recherche.
Nous voulons lister tous les utilisateurs, nous allons donc utiliser la méthode FindAll() :
On boucle pour récupérer et afficher les informations souhaitées
Dim DirEntry As DirectoryEntry
For Each result As SearchResult In searcher.FindAll
// We retrieve the entry found during the search
DirEntry = result.GetDirectoryEntry
//We can now display the desired information
Console.WriteLine("Login: " + DirEntry.Properties("SAMAccountName").Value)
Console.WriteLine("Name: " + DirEntry.Properties("sn").Value)
Console.WriteLine("First Name: " + DirEntry.Properties("givenName").Value)
Console.WriteLine("Email: " + DirEntry.Properties("mail").Value)
Console.WriteLine("Tel: " + DirEntry.Properties("TelephoneNumber").Value)
Console.WriteLine("Description: " + DirEntry.Properties("description").Value)
Console.WriteLine("-------------------")
Next
Ce code vous permet d'accéder à diverses informations sur chaque utilisateur contenu dans Active Directory.
Je n'ai limité ici l'affichage qu'à ces valeurs, mais vous pouvez en ajouter d'autres, comme l'adresse,
l'entreprise, etc
VI. Modification d'un utilisateur
Modifier un utilisateur est aussi simple que visualiser des utilisateurs. En effet, pour le modifier, il suffit de le retrouver dans Active Directory (ce que vous avez vu dans le chapitre précédent).
Il vous suffit donc de changer la valeur du filtre de recherche et d'utiliser la méthode FindOne() plutôt que FindAll(), car on suppose que vous souhaitez uniquement modifier les informations d'un seul utilisateur.
Revenons donc à notre code :
Modifier un utilisateur
// Connect to the directory
Dim Ldap As DirectoryEntry = new DirectoryEntry("LDAP://your-AD-name", "Login", "Password")
// New object to instantiate the search
Dim searcher As DirectorySearcher = New DirectorySearcher (Ldap))
// We modify the filter to only search for the user whose login name is TEST
searcher.Filter = "(SAMAccountName=TEST)"
// No foreach loop because we are only looking for a user
Dim result As SearchResult = searcher.FindOne()
// We retrieve the object found during the search
Dim DirEntry As DirectoryEntry = result.GetDirectoryEntry()
// We modify the description property of the user TEST
DirEntry.Properties("description").Value = "New description for TEST"
// And his phone number
DirEntry.Properties("TelephoneNumber").Value = "0123456789"
// Send changes to Active Directory
DirEntry.CommitChanges()
Explications du code :
On commence par se connecter à l'annuaire LDAP. Ensuite, on utilise un objet DirectorySearcher sur lequel on applique
le filtre approprié : on veut uniquement l'utilisateur dont le login est TEST, donc dont SAMAccountName=TEST.
Lancez ensuite la recherche.
Une fois que vous avez trouvé le premier objet correspondant, vous le récupérez, puis vous pouvez modifier son ou ses attributs.
Enfin, l'appel à CommitChanges() envoie les modifications au serveur Active Directory.
VII. Ajouter un utilisateur
Pour ajouter un utilisateur, c'est un peu le même principe :
Connexion à Active Directory ;
Création d'un nouvel objet ;
Définir les propriétés de l'objet ;
Envoi des modifications au serveur.
Voyons donc à quoi cela ressemble en termes de code :
Ajouter un utilisateur
// Connect to the directory
Dim Ldap As DirectoryEntry = new DirectoryEntry("LDAP://your-AD-name", "Login", "Password")
// Create the user Test User and initialize its properties
Dim user As DirectoryEntry = Ldap.Children.Add("cn=Test User", "user")
user.Properties("SAMAccountName").Add("testuser")
user.Properties("sn").Add("User")
user.Properties("givenName").Add("Test")
user.Properties("description").Add("Test account created by code")
// We send the modifications to the server
user.CommitChanges()
// We are now going to define his password. The user must have been created
// and saved before you can do this step
user. Invoke("SetPassword", new object () {"password"})
// We will now activate the account: ADS_UF_NORMAL_ACCOUNT
user.Properties["userAccountControl"].Value = 0x0200
// We send the modifications to the server
user.CommitChanges()
Explications du code :
Ici on se connecte à l'Active Directory, puis on indique que l'on va ajouter un nœud enfant au moyen de Children.Add, qui prend en paramètre :
.le nom de la nouvelle entrée ;
.le schéma (type) de la nouvelle entrée. Dans notre cas, il s’agit d’un utilisateur, donc utilisateur en anglais.
Ensuite, nous définissons les propriétés de l'utilisateur, grâce à la méthode Add : son nom de login (SAMAccountName), son nom, son prénom et sa description.
Une fois cela fait, nous appelons CommitChanges(), afin de renvoyer les modifications (dans notre cas, un ajout) au serveur.
Ensuite, nous utilisons la méthode Invoke pour définir le mot de passe de l'utilisateur. Avant de pouvoir utiliser cette méthode, nous devons nous assurer que l'utilisateur existe dans AD, d'où l'appel précédent à CommitChanges().
Enfin, nous définissons le type de compte que nous voulons, à l'aide de la propriété userAccountControl : nous voulons un compte simple, nous devons donc utiliser la constante appropriée.
Voici la liste des constantes :
Value Effect
const long ADS_UF_SCRIPT = 0x0001; The startup script will be executed
const long ADS_UF_ACCOUNTDISABLE = 0x0002; Disable Account
const long ADS_UF_HOMEDIR_REQUIRED = 0x0008; Requires root directory
const long ADS_UF_LOCKOUT = 0x0010; Account is locked
const long ADS_UF_PASSWD_NOTREQD = 0x0020; No password needed
const long ADS_UF_PASSWD_CANT_CHANGE = 0x0040; User cannot change password
const long ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0x0080; PDM encryption allowed
const long ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0x0100; Local user account
const long ADS_UF_NORMAL_ACCOUNT = 0x0200; Classic account
Vous pouvez trouver cette liste (avec des exemples) ici :
Enfin, un dernier appel à CommitChanges() envoie les dernières modifications/ajouts apportés à l'utilisateur au serveur.
Voilà, vous avez créé avec succès l'utilisateur Test User dont le nom de login est testuser et dont
les propriétés sont celles que vous avez définies ci-dessus.
VIII. Conclusion
Ici, nous avons vu, tout au long de cet article, les principales opérations que vous pourrez être amené à effectuer si vous utilisez
Active Directory en conjonction avec VB.NET.
Bien entendu, cet article n'est pas exhaustif : d'autres opérations peuvent être réalisées, aussi bien sur les groupes que sur les utilisateurs,
mais je me suis contenté d'aller à l'essentiel et à ce qui pouvait concerner le plus grand nombre
des développeurs : pourquoi pas une suite dans un prochain article…
En attendant, j'espère que vous avez apprécié la lecture de celui-ci et je vous dis :