2009-10-22 22 views
11

Mi chiedo come ottenere un elenco di tutti i computer/macchine/pc dalla directory attiva?Elenca tutti i computer nella directory attiva

(Cercando di fare questa pagina un'esca motore di ricerca, risponderà me stesso. Se qualcuno ha una migliore rispondere il accettare che)

risposta

23

Se si dispone di un grande dominio, o il vostro dominio ha limiti configurato come come molti articoli possono essere restituiti per ricerca, potrebbe essere necessario utilizzare il paging.

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; 
} 
1

Una query LDAP come: (objectCategory = computer) dovrebbe fare il trucco. -Jim

5

Cosa EKS suggerito è corretta, ma sta eseguendo un po 'lento .

Il motivo è la chiamata a GetDirectoryEntry() per ogni risultato. Questo crea un oggetto DirectoryEntry, che è necessario solo se è necessario modificare l'oggetto Active Directory (AD). Va bene se la query restituirà un singolo oggetto, ma quando si elenca tutti gli oggetti in AD, questo peggiora notevolmente le prestazioni.

Se è necessario solo eseguire una query su AD, è meglio utilizzare la raccolta Properties dell'oggetto risultato. Ciò migliorerà le prestazioni del codice più volte.

Questo è spiegato in documentation for SearchResult class:

Le istanze della classe SearchResult sono molto simili alle istanze di DirectoryEntry classe. La differenza fondamentale è che la classe DirectoryEntry recupera le sue informazioni dal gerarchia di Active Servizi di dominio ogni volta che un nuovo oggetto viene accede, mentre i dati per SearchResult è già disponibile in il SearchResultCollection, dove viene restituito da una query che viene eseguito con la classe DirectorySearcher.

Ecco un esempio su come utilizzare la collezione Properties:

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 for SearchResult.Properties

Nota che le proprietà possono avere più valori, è per questo che usiamo Properties["name"].Count per verificare il numero di valori.

Per migliorare ulteriormente le cose, utilizzare la raccolta PropertiesToLoad per consentire all'utente di sapere quali proprietà si intende utilizzare in anticipo. Ciò consente al ricercatore di leggere solo i dati che verranno effettivamente utilizzati.

Si noti che le DirectoryEntry e DirectorySearcher oggetti devono essere smaltite al fine di liberare tutte le risorse utilizzate. Il suo migliore fatto con una clausola using.

Problemi correlati