Active Directory междоменный поиск - PullRequest
2 голосов
/ 10 сентября 2011

У меня есть лес 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 ]

4 голосов
/ 10 сентября 2011

Поскольку вы сказали, что 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 голосов
/ 11 сентября 2011

Итак, несколько вещей:

  • Вы должны пойти против глобального каталога. Образец переплета можно увидеть в записке Харви.
  • Вам необходимо заменить (objectClass=person) на (objectCategory=person)(objectClass=user)
  • Ваш поисковый фильтр невероятно неэффективен. Ни один из перечисленных вами атрибутов не имеет типа индекса, необходимого для выполнения медиального поиска полуэффективным способом по умолчанию. Как минимум, вы должны хотя бы заменить
  • Исходя из того, что, по вашему мнению, вы делаете, вы должны убедиться, что поиск ANR - это то, что вы действительно хотите - http://msdn.microsoft.com/en-us/library/cc223243(PROT.13).aspx
  • Выполнение сортировки на стороне сервера может быть дорогим и может привести к сбою при большом наборе результатов. Вы можете сделать это локально
  • Вы должны добавить PageSize к своему поисковику
...