2012-08-01 5 views
5

Chcę znaleźć najbardziej specyficzną jednostkę organizacyjną, do której należy mój komputer w C#. Mam kod, który dostanie informacje, których potrzebuję, ale nie czuje się dobrze i wymagałoby skomplikowanego analizowania. Czy są lepsze alternatywy? Myśli? Każda pomoc jest doceniana!Jak mogę znaleźć jednostki organizacyjne, do których należy komputer? (Active Directory C#)

naprawdę czego chcę to equivilent do szybkiego komend:

dsquery computer -name COMP-HERE 

Ale muszę go w C#, który okazuje się być problematyczne.

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

Odpowiedz

2

Oto rozwiązanie przy użyciu PrincipalContext i ComputerPrincipal w przestrzeni nazw System.DirectoryServices.AccountManagement

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

Linq traktowanie nazwy wyróżniającej maszyny dzieli ją na elementy składowe, pomija wszelkie elementy przed pierwszym elementem OU=..., a następnie repozytoruje resztę., Pozostawiając wyróżnienie ed nazwa zawierającej OU.

Więcej informacji

Klasy w przestrzeni nazw System.DirectoryServices.AccountManagement dostarczenie abstrakcji dość wysokim poziomie różnego rodzaju podmiotów zabezpieczeń (kont).

The PrincipalContext jest w zasadzie abstrakcją repozytorium kont. Może odnosić się do bazy danych kont maszyny (PrincipalType.Machine), domeny Active Directory lub katalogu globalnego (PrincipalType.Domain) lub partycji aplikacji Active Directory (PrincipalType.ApplicationDirectory).

new PrincipalContext(ContextType.Domain) tworzy PrincipalContext reprezentujący lokalną domenę Active Directory.

Gdy mamy ten kontekst możemy użyć FindBy...() metod statycznych na różnych głównych typów (może być UserPrincipal, ComputerPrincipal lub GroupPrincipal), aby znaleźć obiekt AD szukamy.

+0

Tak więc moja znajomość C# i Active Directory jest ograniczona ... Czy możesz nieco wyjaśnić, co dokładnie robi ten kod? Jestem trochę zdezorientowany przez PrincipalContext. Kod działa świetnie! Po prostu chcę to zrozumieć. – user1507986

+0

Zobacz odpowiedź aktualizacja –

+0

Jaki jest powód używania SkipWhile zamiast Gdzie? –

0

Zrobiłem proste wyszukiwanie w google i znalazłem wiele informacji na ten temat. Myślę, że jesteś w dobrym kierunku, może porównać swój kod z tych linków:

How to get list of Organizational Unit in Active Directory lub tutaj na stack overflow

+0

Pierwszy link ty pisał niemal przeciwieństwo tego, co próbuję zrobić (choć bardzo pokrewne). Próbuje znaleźć jednostki organizacyjne, prawdopodobnie w celu znalezienia w nich rzeczy. Próbuję wziąć komputer i znaleźć OU, że jest w środku. Dziękujemy za szybką odpowiedź! To było nieoczekiwane. – user1507986

0

To co pracował dla mnie

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=")); 
} 
Powiązane problemy