Lister tous les ordinateurs dans Active Directory
-
05-07-2019 - |
Question
Je me demande comment obtenir une liste de tous les ordinateurs / machines / pc à partir du répertoire actif?
(Si vous essayez de faire de cette page un appât pour les moteurs de recherche, vous répondrez moi-même. Si quelqu'un a une meilleure réponse, il l'accepte)
La solution
Si vous avez un très grand domaine ou si votre domaine a des limites sur le nombre d'éléments pouvant être renvoyés par recherche, vous devrez peut-être utiliser la pagination.
using System.DirectoryServices; //add to references
public static List<string> GetComputers()
{
List<string> ComputerNames = new List<string>();
DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no");
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.Filter = ("(objectClass=computer)");
mySearcher.SizeLimit = int.MaxValue;
mySearcher.PageSize = int.MaxValue;
foreach(SearchResult resEnt in mySearcher.FindAll())
{
//"CN=SGSVG007DC"
string ComputerName = resEnt.GetDirectoryEntry().Name;
if (ComputerName.StartsWith("CN="))
ComputerName = ComputerName.Remove(0,"CN=".Length);
ComputerNames.Add(ComputerName);
}
mySearcher.Dispose();
entry.Dispose();
return ComputerNames;
}
Autres conseils
Ce que EKS a suggéré est correct , mais effectue un peu lent .
La raison en est l'appel à GetDirectoryEntry ()
sur chaque résultat. Cela crée un objet DirectoryEntry
, qui n'est nécessaire que si vous devez modifier l'objet Active Directory (AD). Si votre requête renvoie un seul objet, vous pouvez continuer, mais si vous listez tous les objets dans AD, cela réduit considérablement les performances.
Si vous avez seulement besoin d'interroger AD, il est préférable d'utiliser simplement la collection Propriétés
de l'objet de résultat. Cela améliorera les performances du code plusieurs fois.
Ceci est expliqué dans la documentation. pour la classe SearchResult
:
Les instances de la classe
SearchResult
sont très similaires aux instances de classeDirectoryEntry
. La différence cruciale est que le La classeDirectoryEntry
récupère ses informations à partir de la classe Active La hiérarchie des services de domaine de répertoire chaque fois qu'un nouvel objet est consultés, alors que les données pourSearchResult
sont déjà disponibles dansSearchResultCollection
, où il est renvoyé par une requête qui est effectuée avec la classeDirectorySearcher
.
Voici un exemple sur l'utilisation de la collection Propriétés
:
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 < code> SearchResult.Properties
Notez que les propriétés peuvent avoir plusieurs valeurs. C'est pourquoi nous utilisons Propriétés ["nom"]. Compte
pour vérifier le nombre de valeurs.
Pour améliorer encore les choses, utilisez la collection PropertiesToLoad
afin d'informer le chercheur des propriétés que vous allez utiliser à l'avance. Cela permet au chercheur de ne lire que les données qui seront réellement utilisées.
Notez que les objets
DirectoryEntry
etDirectorySearcher
doivent être être correctement disposé afin de libérer toutes les ressources utilisées. Son meilleur fait avec uneusing
clause.
Une requête LDAP telle que: (objectCategory = computer)
devrait faire l'affaire.