2012-08-01 3 views
5

Desidero trovare l'OU più specifica del mio computer in C#. Ho il codice che otterrà le informazioni di cui ho bisogno, ma non sembra robusto e richiederebbe un parsing complicato. Ci sono alternative migliori? Pensieri? Qualsiasi aiuto è apprezzato!Come individuare le unità organizzative di cui fa parte un computer? (Active Directory C#)

veramente quello che voglio è un equivilent al comando prompt dei comandi:

dsquery computer -name COMP-HERE 

ma ho bisogno che in C#, che si sta rivelando di essere problematico.

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(); 

risposta

2

Ecco una soluzione che utilizza PrincipalContext e ComputerPrincipal nel System.DirectoryServices.AccountManagement namespace

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()); 
} 

Il Il trattamento Linq del nome distinto della macchina lo divide in elementi componente, salta tutti gli elementi prima del primo elemento OU=... e quindi ricombina il resto. nome editore dell'UO contenente.

Maggiori informazioni

Le classi del namespace System.DirectoryServices.AccountManagement fornire un'astrazione piuttosto alto livello di vari tipi di entità di protezione (account).

Il PrincipalContext è fondamentalmente un'astrazione del repository dell'account. Può fare riferimento al database dell'account di una macchina (PrincipalType.Machine), a un dominio di Active Directory o a un catalogo globale (PrincipalType.Domain) oa una partizione dell'applicazione di Active Directory (PrincipalType.ApplicationDirectory).

new PrincipalContext(ContextType.Domain) crea un PrincipalContext che rappresenta il dominio di Active Directory locale.

Una volta che abbiamo ottenuto questo contesto, possiamo utilizzare i metodi statici FindBy...() sui vari tipi principali (può essere UserPrincipal, ComputerPrincipal o GroupPrincipal) per trovare l'oggetto dC che stiamo cercando.

+0

Quindi la mia conoscenza di C# e Active Directory è limitata ... Puoi approfondire un po 'cosa sta facendo esattamente questo codice? Sono un po 'confuso dal PrincipalContext. Il codice funziona benissimo! Voglio solo capirlo. – user1507986

+0

Vedere l'aggiornamento della risposta –

+0

Qualche motivo per l'utilizzo di SkipWhile anziché di Dove? –

0

ho fatto una semplice ricerca su google e ho trovato un sacco di informazioni su questo. Penso che tu sia in buona direzione, forse confrontare il codice con questi collegamenti:

How to get list of Organizational Unit in Active Directory o qui su stack overflow

+0

Il primo link che hai postato quasi l'opposto di quello che sto cercando di fare (anche se molto correlato). Sta cercando di trovare OU, presumibilmente per trovare le cose al loro interno. Sto provando a prendere un computer e trovare l'UO che è dentro. Grazie per la pronta risposta! È stato inaspettato – user1507986

0

Questo è ciò che ha funzionato per me

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=")); 
}