Como posso obter uma lista de unidades organizacionais do Active Directory?

Eu olhei para a class DirectoryServices e parece ser o que eu preciso, mas não consigo encontrar as classs / methods necessários para buscar uma coleção de Unidades Organizacionais.

Vocês podem dar algumas sugestões?

    Você precisa usar um DirectorySearcher apropriado de System.DirectoryServices , e você precisa procurar pela class organizationalUnit AD (eu recomendaria pesquisar com base na objectCategory que é de valor único e indexada – muito mais rápido do que usar objectClass ) – algo como isto:

     List orgUnits = new List(); DirectoryEntry startingPoint = new DirectoryEntry("LDAP://DC=YourCompany,DC=com"); DirectorySearcher searcher = new DirectorySearcher(startingPoint); searcher.Filter = "(objectCategory=organizationalUnit)"; foreach (SearchResult res in searcher.FindAll()) { orgUnits.Add(res.Path); } 
     List source = new List(); DirectoryEntry root = new DirectoryEntry("LDAP://app.shgbit.com"); DirectoryEntry gbvision = root.Children.Find("OU=UMP"); DirectorySearcher searcher = new DirectorySearcher(gbvision); searcher.Filter = "(objectClass=computer)"; int index = 1; foreach (SearchResult each in searcher.FindAll()) { var box = each.GetDirectoryEntry(); source.Add(new PlayerBO { Id = index++, Name = box.Properties["name"].Value.ToString(), Description = box.Properties["description"].Value.ToString() }); } ListViewAD.ItemsSource = new SelectableSource(source); 

    Eu sei que esta discussão é um pouco antiga, mas eu criei recentemente uma maneira mais eficiente de manobrar através de DirectoryEntries do que o DirectorySearcher fornece e queria compartilhar desde que este foi o resultado superior no Google. Este exemplo replica a estrutura da UO com base em um ponto inicial especificado inicialmente.

    O caminho DN passado para o primeiro construtor deve estar no formato “LDAP: // OU = StartingOU, DC = teste, DC = com”

     using System.DirectoryServices; using System.Threading.Tasks; public class ADTree { DirectoryEntry rootOU = null; string rootDN = string.Empty; List childOUs = new List(); public DirectoryEntry RootOU { get { return rootOU; } set { rootOU = value; } } public string RootDN { get { return rootDN; } set { rootDN = value; } } public List ChildOUs { get { return childOUs; } set { childOUs = value; } } public ADTree(string dn) { RootOU = new DirectoryEntry(dn); RootDN = dn; BuildADTree().Wait(); } public ADTree(DirectoryEntry root) { RootOU = root; RootDN = root.Path; BuildADTree().Wait(); } private Task BuildADTree() { return Task.Factory.StartNew(() => { object locker = new object(); Parallel.ForEach(RootOU.Children.Cast().AsEnumerable(), child => { if (child.SchemaClassname.Equals("organizationalUnit")) { ADTree ChildTree = new ADTree(child); lock (locker) { ChildOUs.Add(ChildTree); } } }); }); } } 

    Para construir, tudo o que você precisa fazer é o seguinte:

     ADTree Root = null; Task BuildOUStructure = Task.Factory.StartNew(() => { ADTree = new ADTree("LDAP://ou=test,dc=lab,dc=net"); }); BuildOUStructure.Wait(); 

    Você já olhou para o método DirectorySearcher ?

    Aqui estão alguns exemplos no MSDN e no bytes.com .

    Esta é a minha solução e está funcionando:

     List DisplayedOU = new List(); int step = 0; string span = " -- "; private void getOU2() { string strRet = ""; DirectoryEntry domainRoot = new DirectoryEntry("LDAP://uch.ac/OU=ALL,DC=uch,DC=ac", "user", "pass"); // set up directory searcher based on default naming context entry DirectorySearcher ouSearcher = new DirectorySearcher(domainRoot); // SearchScope: OneLevel = only immediate subordinates (top-level OUs); // subtree = all OU's in the whole domain (can take **LONG** time!) ouSearcher.SearchScope = SearchScope.Subtree; // ouSearcher.SearchScope = SearchScope.Subtree; // define properties to load - here I just get the "OU" attribute, the name of the OU ouSearcher.PropertiesToLoad.Add("ou"); // define filter - only select organizational units ouSearcher.Filter = "(objectCategory=organizationalUnit)"; int cnt = 0; foreach (SearchResult deResult in ouSearcher.FindAll()) { string temp = deResult.Properties["ou"][0].ToString(); strRet += FindSubOU(deResult.Properties["adspath"][0].ToString(), cnt); } Literal1.Text = strRet; } private string FindSubOU(string OU_Path, int cnt) { string strRet = ""; DirectoryEntry domainRoot = new DirectoryEntry(OU_Path, "user", "pass"); // set up directory searcher based on default naming context entry DirectorySearcher ouSearcher = new DirectorySearcher(domainRoot); // SearchScope: OneLevel = only immediate subordinates (top-level OUs); // subtree = all OU's in the whole domain (can take **LONG** time!) ouSearcher.SearchScope = SearchScope.Subtree; // ouSearcher.SearchScope = SearchScope.Subtree; // define properties to load - here I just get the "OU" attribute, the name of the OU ouSearcher.PropertiesToLoad.Add("ou"); // define filter - only select organizational units ouSearcher.Filter = "(objectCategory=organizationalUnit)"; //adspath // do search and iterate over results foreach (SearchResult deResult in ouSearcher.FindAll()) { string temp = deResult.Properties["ou"][0].ToString(); if (!DisplayedOU.Contains(deResult.Properties["ou"][0].ToString())) { string strPerfix = ""; for (int i = 0; i < step; i++) strPerfix += span; strRet += strPerfix + ++cnt + ". " + deResult.Properties["ou"][0].ToString() + " ----> " + deResult.Properties["adspath"][0].ToString() + "
    "; DisplayedOU.Add(deResult.Properties["ou"][0].ToString()); step++; strRet += FindSubOU(deResult.Properties["adspath"][0].ToString(), cnt); step--; } } return strRet; }