如何在活动目录c#中在指定ou下面列出ou(组织单位)?



由于我在从Active Directory检索信息方面不是很有经验,我希望得到一些指向正确方向的指点。

我想在指定ou下面列出所有ou(组织单位),但不幸的是,我不知道如何使其工作。

假设AD的结构如下

SomeStartingPoint
|-MySpecifiedOuName
  |-SubOuName1
    |-SubOuName2

目前我得到的是

DirectoryEntry rootDSE = new DirectoryEntry( "LDAP://RootDSE" );
string defaultNamingContext = rootDSE.Proeprties[ "defaultNamingContext" ].Value.ToString();
DirectoryEntry entry = new DirectoryEntry( "LDAP://" + defaultNamingContext );
DirectorySearcher ouSearch = 
    new DirectorySearcher( entry.Path ) { Filter = "(objectCategory=organizationalUnit)", SearchScope = SearchScope.Subtree };
 
ouSearch.PropertiesToLoad.Add( "name" );
ouSearch.PropertiesToLoad.Add( "adspath" );
SearchResultCollection allOUs = ouSearch.FindAll();

现在我可以遍历allOUs并访问.Properties[ "name" ][ 0 ].Properties[ "adspath" ][ 0 ]以列出所有ou的值。

现在,当我尝试使用Filter = (&(objectCategory=organizationalUnit)(ou=MySpecifiedOuName))中不同的过滤器时,我确实得到了与MySpecifiedOuName完全对应的单个条目,但不是下面的底层ou,即使它们在其路径中包含MySpecifiedOuName。这可能是因为在我的例子中,我查询了错误的东西(直接查询OU),但我不知道还有其他方法。

任何想法?

试试这个过滤器:

"(objectCategory=CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=dom,DC=fr)"

适合您的域,configurationNamingContext从RootDSE为CN=Configuration,DC=dom,DC=fr

这可能是由于objectCategory是一个不同的名称,我知道微软工具正在进行翻译,但它似乎不适合你这里。

——编辑——

正如@Desmond坚持的事实"(objectCategory=organizationalUnit)",我只是测试它,它是有效的。"(objectCategory=CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=dom,DC=fr)"也可以。

DirectoryEntry deBase = new DirectoryEntry("LDAP://WM2008R2ENT:389/dc=dom,dc=fr", "jpb", "Pwd");
/* Directory Search
 */
DirectorySearcher dsLookForOUs = new DirectorySearcher(deBase);
dsLookForOUs.Filter = "(objectCategory=organizationalUnit)";
dsLookForOUs.SearchScope = SearchScope.Subtree;
dsLookForOUs.PropertiesToLoad.Add("cn");
dsLookForOUs.PropertiesToLoad.Add("ou");
SearchResultCollection srcOUs = dsLookForOUs.FindAll();
foreach (SearchResult srOU in srcOUs)
{
  Console.WriteLine("{0}", srOU.Path);
}

唯一的方法就是采用递归的方式。ou是OU的RDN属性(很像CN是用户的)。因此,搜索ou=foo只会得到将OU属性设置为foo的ou。

为了遍历链,您需要对当前级别的所有ou进行搜索(使用OneLevel搜索而不是SubTree),然后递归遍历那里。但是,这一点都不高效,因为您将向AD发出大量查询。

相反,你可以做你正在做的事情,然后通过基于DN/depth排序来构建层次结构。这更复杂,但从资源访问的角度来看,它将更有效。

您很可能只错过了subtree选项:

ouSearch.SearchScope = SearchScope.Subtree;

最新更新