2012-08-01 12 views
5

Quiero encontrar la unidad organizativa más específica a la que pertenece mi computadora en C#. Tengo un código que obtendrá la información que necesito, pero no se considera robusto y requeriría un análisis complicado. ¿Hay mejores alternativas? ¿Pensamientos? ¡Cualquier ayuda es apreciada!¿Cómo puedo encontrar de qué unidades organizativas forma parte una computadora? (Active Directory C#)

realmente lo que quiero es una equivilent al comando símbolo del sistema:

dsquery computer -name COMP-HERE 

Pero lo necesito en C#, que está demostrando ser problemático.

DirectorySearcher d = new DirectorySearcher("CN=COMP-HERE"); 
d.PropertiesToLoad.Add("adspath"); 
SearchResultCollection results = d.FindAll(); 
foreach (SearchResult searchResult in results) { 
    foreach (string propertyKey in searchResult.Properties.PropertyNames) { 
     ResultPropertyValueCollection valueCollection = searchResult.Properties[propertyKey]; 
     foreach (Object propertyValue in valueCollection) { 
      Console.WriteLine(
      "{0}:{1}", 
      propertyKey, 
      propertyValue.ToString()); 
     } 
    } 
} 
Console.ReadLine(); 

Respuesta

2

Aquí es una solución utilizando PrincipalContext y ComputerPrincipal en el System.DirectoryServices.AccountManagement espacio de nombres

string machineOU; 
using (var context = new PrincipalContext(ContextType.Domain)) 
using (var comp = ComputerPrincipal.FindByIdentity(context, Environment.MachineName)) 
{ 
    machineOU = String.Join(",", comp.DistinguishedName.Split(',') 
                 .SkipWhile(s => !s.StartsWith("OU=")) 
                 .ToArray()); 
} 

El El tratamiento de Linq del nombre distinguido de la máquina lo divide en sus elementos componentes, se salta cualquier elemento antes del primer elemento OU=... y luego recombina el resto. Dejándolo con la distinción nombre de la unidad organizativa que contiene.

Más Información

Las clases en el espacio de nombres System.DirectoryServices.AccountManagement proporcionan una abstracción bastante alto nivel de varios tipos de entidades de seguridad (cuentas).

El PrincipalContext es básicamente una abstracción del depósito de la cuenta. Puede hacer referencia a la base de datos de cuenta de una máquina (PrincipalType.Machine), un dominio de Active Directory o un catálogo global (PrincipalType.Domain) o una partición de aplicación de Active Directory (PrincipalType.ApplicationDirectory).

new PrincipalContext(ContextType.Domain) crea un PrincipalContext que representa el dominio local de Active Directory.

Una vez que tenemos este contexto podemos utilizar los métodos estáticos FindBy...() sobre los distintos tipos principales (puede ser UserPrincipal, ComputerPrincipal o GroupPrincipal) para encontrar el objeto de anuncio que estamos buscando.

+0

Así que mi conocimiento de C# y Active Directory es limitado ... ¿Puede explicar un poco sobre qué está haciendo exactamente este código? Estoy un poco confundido por PrincipalContext. ¡Aunque el código funciona muy bien! Solo quiero entenderlo. – user1507986

+0

Ver la respuesta de actualización –

+0

¿Alguna razón para usar SkipWhile en lugar de Where? –

0

He hecho una búsqueda simple en google y encontré mucha información sobre esto. Creo que usted está en la buena dirección, tal vez comparar el código con estos enlaces:

How to get list of Organizational Unit in Active Directory o aquí en stack overflow

+0

El primer enlace que envió casi lo contrario de lo que estoy tratando de hacer (aunque muy relacionada). Está tratando de encontrar OU, presumiblemente para encontrar cosas dentro de ellos. Intento tomar una computadora y encontrar la OU que está adentro. ¡Gracias por su pronta respuesta! Fue inesperado. – user1507986

0

Esto es lo que funcionó para mí

IEnumerable<string> machineOU; 
using (var context = new PrincipalContext(ContextType.Domain)) 
using (var comp = ComputerPrincipal.FindByIdentity(context, Environment.MachineName)) 
{ 
    machineOU = comp.DistinguishedName.Split(',').Where(s => s.StartsWith("OU=")); 
} 
Cuestiones relacionadas