使用OU的部分路径在Active Directory中搜索OU

时间:2011-05-03 16:46:49

标签: c# active-directory directory ldap directoryservices

在AD查询语法中是否有办法通过搜索其部分路径来查找OU的完整路径?

例如,我的OU的完整路径是:

OU=Clerks,OU=OfficeA,OU=Administration,DC=domain,DC=local

现在,我想通过使用部分路径尝试搜索并找到该对象:

OU=Clerks,OU=OfficeA

我希望能够搜索类似的内容:

(&(objectCategory=organizationalUnit)(path=Clerks/OfficeA*))

我找不到任何有关如何完成此类操作的语法示例。我正在开发的程序要求我获得许多OU的路径,这些OU在OU的最后两个级别都具有共同的结构,但是它们可以嵌套在域中的任何给定深度。如果我能以这种方式进行搜索,那么只需通过最后两个OU嵌套级别搜索完整路径就很容易。

1 个答案:

答案 0 :(得分:2)

您想要做的事情存在于纯LDAP实现上,它是一个名为 ExtensibleMatch 的功能,似乎在this wiki article中得到了正确解释。您还会找到一些有用的示例here

但它在Active-Directory中不存在

所以这是一个在C#中编写的方法,它利用Parent的{​​{1}}属性。

DirectoryEntry

以下是用法:

   static List<DirectoryEntry> OuInTheFormOf(DirectoryEntry deBase, string ou1, string ou2)
    {
      List<DirectoryEntry> deList = null;

      /* Directory Search
       */
      DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
      dsLookFor.Filter = ou1;
      dsLookFor.SearchScope = SearchScope.Subtree;
      dsLookFor.PropertiesToLoad.Add("ou");

      SearchResultCollection srcOUs = dsLookFor.FindAll();

      if (srcOUs.Count != 0)
      {
        deList = new List<DirectoryEntry>();

        foreach (SearchResult srOU in srcOUs)
        {
          DirectoryEntry deOU = srOU.GetDirectoryEntry();
          if (deOU.Parent.Name.ToUpper() == ou2.ToUpper())
            deList.Add(deOU);
        }
      }
      return deList;
    }