由于我在从Active Directory检索信息方面不是很有经验,所以我希望能够指出正确的方向。
我想列出指定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),但我不知道其他任何方式。
有什么想法吗?
提前致谢&
祝你好运
-G。
答案 0 :(得分:2)
试试这个过滤器:
"(objectCategory=CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=dom,DC=fr)"
使用来自RootDSE configurationNamingContext
CN=Configuration,DC=dom,DC=fr
改编自您的域名
这可能是因为objectCategory是一个区别名称,我知道Microsoft工具正在进行翻译,但似乎不适合你。
- - - - - - - - 编辑的
由于@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);
}
答案 1 :(得分:1)
做所需的唯一方法是以递归的方式。 ou
是OU的RDN属性(很像CN
用于用户)。因此,搜索ou=foo
只会将您的OU
属性设置为foo的OU。
为了走链,您需要搜索当前级别的所有OU(使用OneLevel
搜索而不是SubTree
),然后通过递归那里。但这并不是很有效,因为您将向AD发出大量查询。
相反,您可以执行您正在执行的操作,然后通过基于DN /深度进行排序来构建层次结构。这更复杂,但从资源访问的角度来看会更有效。
答案 2 :(得分:0)
您很可能只缺少subtree
选项:
ouSearch.SearchScope = SearchScope.Subtree;