由于我在从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;