14 votes

Liste de tous les ordinateurs dans le répertoire actif

Je me demande comment obtenir une liste de tous les ordinateurs / machines / pc à partir d'Active Directory ?

(J'essaie de faire de cette page un appât pour les moteurs de recherche, je répondrai moi-même. Si quelqu'un a une meilleure réponse, je l'accepterai)

31voto

EKS Points 2540

Si votre domaine est très vaste ou s'il a été configuré pour limiter 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;
}

16voto

quasoft Points 3673

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.

2voto

jeemster Points 2578

Une requête LDAP comme : (objectCategory=computer) devrait faire l'affaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X