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)

Était-ce utile?

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   classe DirectoryEntry . La différence cruciale est que le   La classe DirectoryEntry 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 pour SearchResult sont déjà disponibles dans    SearchResultCollection , où il est renvoyé par une requête qui   est effectuée avec la classe DirectorySearcher .

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 et DirectorySearcher doivent être   être correctement disposé afin de libérer toutes les ressources utilisées. Son meilleur   fait avec une using clause.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top