我希望能够从Active Directory中提取当前OU的列表我已经在线查看了一些示例代码,但O似乎无法使其工作。
string defaultNamingContext;
DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value.ToString();
DirectorySearcher ouSearch = new DirectorySearcher(rootDSE, "(objectClass=organizationalUnit)",
null, SearchScope.Subtree);
MessageBox.Show(rootDSE.ToString());
try
{
SearchResultCollection collectedResult = ouSearch.FindAll();
foreach (SearchResult temp in collectedResult)
{
comboBox1.Items.Add(temp.Properties["name"][0]);
DirectoryEntry ou = temp.GetDirectoryEntry();
}
我得到的错误是提供商不支持搜索,无法搜索LDAP:// RootDSE任何想法? 对于每个返回的搜索结果,我想将它们添加到组合框中。 (不应该太难)
答案 0 :(得分:10)
您无法在LDAP://RootDSE
级别进行搜索 - 这只是一个包含某些内容的“信息”地址。它实际上并不代表您目录中的任何位置。您需要首先绑定到默认命名上下文:
string defaultNamingContext;
DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value.ToString();
DirectoryEntry default = new DirectoryEntry("LDAP://" + defaultNamingContext);
DirectorySearcher ouSearch = new DirectorySearcher(default,
"(objectClass=organizationalUnit)",
null, SearchScope.Subtree);
一旦你这样做,你应该可以找到你域中的所有OU。
为了加快速度,我建议不要使用objectClass
进行搜索 - 该属性不在AD中编入索引。请使用objectCategory
代替索引:
DirectorySearcher ouSearch = new DirectorySearcher(default,
"(objectCategory=Organizational-Unit)",
null, SearchScope.Subtree);
<强>更新强>
我发现此过滤器错误 - 即使objectCategory
中的CN=Organizational-Unit,.....
显示为objectCategory=organizationalUnit
,您需要在搜索成功时指定DirectorySearcher ouSearch = new DirectorySearcher(default,
"(objectCategory=organizationalUnit)",
null, SearchScope.Subtree);
:
{{1}}
答案 1 :(得分:0)
很好的修复,这应该是microsoft为此链接提供的教程的一部分
http://msdn.microsoft.com/en-us/library/ms180890(VS.80).aspx