Lo que sugiere es EKS correcta, pero está realizando un poco lenta .
El motivo es la llamada al GetDirectoryEntry()
en cada resultado. Esto crea un objeto DirectoryEntry
, que solo es necesario si necesita modificar el objeto de directorio activo (AD). Está bien si su consulta devuelve un solo objeto, pero cuando se listan todos los objetos en AD, esto degrada en gran medida el rendimiento.
Si solo necesita consultar AD, es mejor usar la colección Properties
del objeto de resultado. Esto mejorará el rendimiento del código varias veces.
Esto se explica en documentation for SearchResult
class:
instancias de la clase SearchResult
son muy similares a los casos de DirectoryEntry
clase. La diferencia fundamental es que la clase DirectoryEntry
recupera la información de Active jerarquía de los Servicios de dominio Directory cada vez que un nuevo objeto se acceder, mientras que los datos de SearchResult
ya está disponible en la SearchResultCollection
, donde se volvió de una consulta que se realiza con la clase DirectorySearcher
.
Aquí es un ejemplo sobre cómo utilizar la colección 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
Tenga en cuenta que las propiedades se pueden tener varios valores, es por eso que utilizamos Properties["name"].Count
para comprobar el número de valores
Para mejorar aún más las cosas, use la colección PropertiesToLoad
para que el buscador sepa qué propiedades va a utilizar con antelación. Esto le permite al buscador leer solo los datos que realmente se usarán.
Tenga en cuenta que los DirectoryEntry
y DirectorySearcher
objetos deben ser desechados apropiadamente con el fin de liberar todos los recursos utilizados. Es mejor hecho con una cláusula using
.