Ce qu'EKS a suggéré est correct mais il est un peu plus performant lent .
La raison en est l'appel à GetDirectoryEntry()
sur chaque résultat. Cela crée un DirectoryEntry
qui n'est nécessaire que si vous devez modifier l'objet Active Directory (AD). Il n'y a pas de problème si votre requête ne renvoie qu'un seul objet, mais lorsqu'il s'agit de lister tous les objets de l'AD, cela dégrade fortement les performances.
Si vous n'avez besoin que d'interroger AD, il est préférable d'utiliser simplement la fonction Properties
collection de l'objet résultat. Cela améliorera les performances du code de plusieurs fois.
Ceci est expliqué dans la documentation pour SearchResult
classe :
Instances de la SearchResult
sont très similaires aux instances de la classe DirectoryEntry
classe. [ ] DirectoryEntry
récupère ses informations à partir de la hiérarchie Active de l'Active Directory Domain Services à chaque fois qu'un nouvel objet est alors que les données de la classe SearchResult
est déjà disponible dans le site SearchResultCollection
où il est renvoyé à partir d'une requête qui est effectuée avec le DirectorySearcher
classe.
Voici un exemple sur la façon d'utiliser le Properties
collection :
public static List<string> GetComputers()
{
List<string> computerNames = new List<string>();
using (DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no")) {
using (DirectorySearcher mySearcher = new DirectorySearcher(entry)) {
mySearcher.Filter = ("(objectClass=computer)");
// No size limit, reads all objects
mySearcher.SizeLimit = 0;
// Read data in pages of 250 objects. Make sure this value is below the limit configured in your AD domain (if there is a limit)
mySearcher.PageSize = 250;
// Let searcher know which properties are going to be used, and only load those
mySearcher.PropertiesToLoad.Add("name");
foreach(SearchResult resEnt in mySearcher.FindAll())
{
// Note: Properties can contain multiple values.
if (resEnt.Properties["name"].Count > 0)
{
string computerName = (string)resEnt.Properties["name"][0];
computerNames.Add(computerName);
}
}
}
}
return computerNames;
}
Documentation pour SearchResult.Properties
Notez que les propriétés peuvent avoir plusieurs valeurs, c'est pourquoi nous utilisons Properties["name"].Count
pour vérifier le nombre de valeurs.
Pour améliorer encore les choses, utilisez l'option PropertiesToLoad
collection pour indiquer à l'avance au chercheur les propriétés que vous allez utiliser. Cela permet au chercheur de ne lire que les données qui seront réellement utilisées.
Notez que le DirectoryEntry
y DirectorySearcher
Les objets doivent être correctement éliminés afin de libérer toutes les ressources utilisées. Le mieux est de le faire avec un using
clause.