Active Directory 跨域搜索

问题描述 投票:0回答:2

我有一个包含两个域 AA.RR.COM 和 BB.RR.COM 的 Active Directory 林,其中包含用户和组。 我需要搜索两个域中的用户,同时查询其中一个域(例如 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);
}

当所有用户都在同一个域中时,此方法可以正常工作,但当他们分布在同一林中的多个域中时,则效果不佳。

任何帮助都是值得赞赏的。

active-directory ldap cross-domain
2个回答
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);
    }
}

3
投票

那么,有几件事:

  • 你需要反对全球目录。您可以在哈维的笔记中看到装订样本。
  • 您需要将
    (objectClass=person)
    替换为
    (objectCategory=person)(objectClass=user)
  • 您的搜索过滤器效率极低。默认情况下,您列出的所有属性都不具有以半高效方式执行媒体搜索所需的索引类型。至少,你至少应该更换
  • 根据您正在做的事情,您应该看看 ANR 搜索是否是您真正想要的 - http://msdn.microsoft.com/en-us/library/cc223243(PROT.13).aspx
  • 在服务器端进行排序可能成本高昂,并且可能因结果集较大而失败。您可能想在本地执行此操作
  • 您应该向搜索器添加 PageSize
© www.soinside.com 2019 - 2024. All rights reserved.