如何在Active Directory C#中的指定ou下面列出ous(组织单位)

时间:2011-10-07 08:56:37

标签: c# active-directory enumeration

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

3 个答案:

答案 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;