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
.