5

我想从 Active Directory 中获取 OU 列表。

我只有域名。

我如何使用 c# 来实现这一点?

4

2 回答 2

7

尝试这样的事情:

// connect to "RootDSE" to find default naming context
DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");

string defaultContext = rootDSE.Properties["defaultNamingContext"][0].ToString();

// bind to default naming context - if you *know* where you want to bind to - 
// you can just use that information right away
DirectoryEntry domainRoot = new DirectoryEntry("LDAP://" + defaultContext);

// 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.OneLevel;
// 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)";

// do search and iterate over results
foreach (SearchResult deResult in ouSearcher.FindAll())
{
    string ouName = deResult.Properties["ou"][0].ToString();
}

如果您有一个域名(例如mycompany.com),那么通常会调用LDAP 根域dc=mycompany,dc=com- 这是一种约定,但不一定非要如此。这就是为什么我要连接到LDAP://RootDSE虚拟 LDAP 根目录并读出Default Naming Context提供默认 LDAP 路径的属性。

如果您知道要连接到哪里 - 可以跳过第一步,只需提供有效的 LDAP 路径(例如LDAP://dc=YourCompany,dc=co,dc=jp或其他)来创建domainRoot目录条目。

于 2012-11-28T13:21:22.473 回答
4

在项目中添加对 System.DirectoryServices 的引用

    public static List<string> ListOu()
    {
        List<string> ous = new List<string>();
        using (DirectoryEntry root = new DirectoryEntry("LDAP://dc=DOMAIN,dc=COM"))
        {
            DirectorySearcher searcher = new DirectorySearcher(root);
            searcher.Filter = "(&(objectClass=organizationalUnit))";
            searcher.SearchScope = SearchScope.Subtree;
            searcher.PropertiesToLoad.Add("distinguishedName");

            var result = searcher.FindAll();
            foreach (SearchResult entry in result)
            {
                ous.Add(entry.GetDirectoryEntry().Properties["distinguishedName"].Value.ToString());
            }        

            result.Dispose();
            searcher.Dispose();
        }
        return ous;
    }
于 2012-11-28T13:34:49.800 回答