2009-10-22 22 views
11

¿Me estoy preguntando cómo obtener una lista de todas las computadoras/máquinas/pc del directorio activo?Listar todas las computadoras en el directorio activo

(Tratando de hacer esta página un cebo de motores de búsqueda, responderá a mí mismo. Si alguien tiene una mejor respuesta il aceptar que)

Respuesta

23

Si usted tiene un gran dominio o su dominio tiene límites configurado en la forma cómo se pueden devolver muchos elementos por búsqueda, puede que tenga que usar la búsqueda.

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 consulta LDAP como: (objectCategory = computer) debería hacer el truco. -Jim

5

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.

Cuestiones relacionadas