如何从Active Directory获取组织单位列表?

我查看了DirectoryServices类,它似乎是我需要的,但我似乎无法找到获取组织单位集合所需的类/方法。

你们能提出一些建议吗?

您需要使用System.DirectoryServices的相应DirectorySearcher ,并且您需要搜索organizationalUnit AD类(我建议基于objectCategory进行搜索,该类是单值和索引的 – 比使用objectClass快得多) – 如下所示:

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

我知道这个post有点旧,但我最近创建了一种比DirectorySeancher更有效的机动方式,而不是DirectorySearcher提供和想要分享,因为这是谷歌的最佳结果。 此示例基于最初指定的起点复制OU结构。

传递给第一个构造函数的DN路径应采用“LDAP:// OU = StartingOU,DC = test,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); } } }); }); } } 

要构建,您需要做的就是以下内容:

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

你看过DirectorySearcher方法了吗?

以下是MSDN和bytes.com的一些示例。

这是我的解决方案,它的工作原理是:

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