2011-11-29 18 views
6

Estoy usando C# para buscar el objectGuid de mi computadora local al consultar Active Directory. Para ello, actualmente estoy usando un DirectorySearcher, pasándole un camino (hardcoded) como la raíz de búsqueda, y luego filtrar por el nombre del equipo:¿Es posible encontrar la computadora local en AD sin hardcoding de su dominio?

string adRootPath = @"LDAP://OU=foo,DC=bar,DC=baz,DC=com";  
DirectoryEntry adRoot = new DirectoryEntry(adRootPath); 

DirectorySearcher searcher = new DirectorySearcher(adRoot); 
searcher.Filter = @"(&(objectCategory=Computer)(CN=" + Environment.MachineName + "))"; 

no quiero a codificar la raíz de búsqueda, y Me preguntaba si hay una mejor manera. Pensé simplemente en usar una raíz de búsqueda vacía, pero me preocupaba que los nombres de las computadoras no siempre fueran únicos en diferentes dominios.

¿Hay una manera mejor?

Respuesta

8

Si estás en .NET 3.5 o posterior, puede utilizar un PrincipalSearcher y un director "de consulta por ejemplo" para hacer su búsqueda:

// create your domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// define a "query-by-example" principal - here, we search for a ComputerPrincipal 
// and with the name of "MyPC" 
ComputerPrincipal cp = new ComputerPrincipal(ctx); 
cp.Name = "MyPC"; 

// create your principal searcher passing in the QBE principal  
PrincipalSearcher srch = new PrincipalSearcher(cp); 

// find all matches 
foreach(var found in srch.FindAll()) 
{ 
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....   
} 

Si no lo ha hecho - absolutamente lea el artículo de MSDN Managing Directory Security Principals in the .NET Framework 3.5 que muestra muy bien cómo hacer el mejor uso de las nuevas características en System.DirectoryServices.AccountManagement

+0

Gracias. ¿Se garantizará que FindAll() encontrará solo un resultado (que es la computadora local), incluso si hay nombres de computadora duplicados en diferentes OU? – Eric

+0

@Eric: no, 'FindAll()' encontrará ** todas ** las ocurrencias que coincidan con los criterios especificados (como su nombre lo indica). Luego puede inspeccionar, p. la propiedad 'DistinguishedName' en' ComputerPrincipal' para ver en qué árbol AD ​​vive esa computadora. También hay un método '.FindOne()' que devuelve la primera coincidencia, pero es posible que no sepa que hay otras computadoras que coinciden con sus criterios. –

+0

Ah, ya veo. Bueno, en realidad estoy tratando de encontrar la información AD de la computadora * local *. Parece que con este método, no tendría forma de distinguir qué computadora es la computadora local en mis resultados. – Eric

Cuestiones relacionadas