Active Directory跨域搜索

时间:2011-09-10 14:04:25

标签: active-directory ldap cross-domain

我有一个包含两个域的Ative Directory林,AA.RR.COM和BB.RR.COM,它们包含用户和组。 我需要在两个域中搜索用户,同时查询其中一个用户,例如AA.RT.COM 如何告诉AD对林中的所有邻居域运行我的LDAP查询?

这是我的代码:

using (var searcher = new DirectorySearcher(new DirectoryEntry(adServerName, adLogin, adPassword)))
{
    var filter = string.Format("(&(objectClass=person)(|(givenName=*{0}*)(displayName=*{0}*)(sn=*{0}*)(mail=*{0}*)))", valueToSearch);

    searcher.ReferralChasing = ReferralChasingOption.All;

    searcher.PropertiesToLoad.AddRange(new[] { 
        "samaccountName", 
        "memberOf", 
        "displayname", 
        "mail" });

    searcher.Sort = new SortOption("samaccountname", SortDirection.Ascending);
}

当所有用户位于同一个域中时,此工作正常,但当它们分布在同一个林中的多个域中时,则无法正常工作。

任何帮助都很明显。

2 个答案:

答案 0 :(得分:4)

由于您说AA.RR.COM和BB.RR.COM位于同一个Active Directory林中,因此您可以检查您的林中是否正在运行全局编录。如果运行全局编录,则可以对全局编录运行LDAP查询。以下是假设AA.RR.COM中有全局编录的示例代码。

using (DirectorySearcher searcher = new DirectorySearcher(new DirectoryEntry("GC://AA.RR.COM")))
{
    var filter = string.Format("(&(objectClass=person)(|(givenName=*{0}*)(displayName=*{0}*)(sn=*{0}*)(mail=*{0}*)))", valueToSearch);

    searcher.ReferralChasing = ReferralChasingOption.All;

    searcher.PropertiesToLoad.AddRange(new[] { "samaccountName", "memberOf", "displayname", "mail" });
    searcher.Sort = new SortOption("samaccountname", SortDirection.Ascending);
    foreach (SearchResult result in searcher.FindAll())
    {
        Console.WriteLine(result.Path);
    }
}

答案 1 :(得分:3)

所以,有一些事情:

  • 您需要违反全局目录。您可以在Harvey的注释中看到样本绑定。
  • 您需要将(objectClass=person)替换为(objectCategory=person)(objectClass=user)
  • 您的搜索过滤器非常低效。您列出的所有属性都没有默认情况下以半效方式进行医疗搜索所需的索引类型。至少应该至少替换
  • 根据您的样子,您应该看看ANR搜索是否是您真正想要的 - http://msdn.microsoft.com/en-us/library/cc223243(PROT.13).aspx
  • 执行服务器端排序可能很昂贵,并且可能因结果集较大而失败。您可能想在本地执行此操作
  • 您应该向搜索者添加PageSize