Поиск по всем поддоменам в ldapContext в Java

Я установил LdapContext в Java и собираюсь выполнить поиск по нему. Я подключаюсь к IP (ldap://1.1.1.20:389) с корневым доменом dc=fake,dc=domain,dc=com. Я хочу проверить пользователей на этом сервере, но пользователи распределены по нескольким доменам в лесу. Я пытаюсь запросить корневой уровень для поиска пользователя во всех поддоменах.

Я нашел этот учебник https://docs.oracle.com/javase/10/jmx/examples-lookup-ldap-client-java.htm#JSJMX-GUID-5BA2ADC5-5597-4F1D-BF53-F1A2C7DB6117, и использовали его, чтобы попытаться выполнить поиск на корневом уровне, преобразовав мой LdapContext как DirContext, как они это делают в учебнике.

ctx = new InitialLdapContext(env, null);
DirContext root = (DirContext) (ctx.lookup(""));

SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchControls.setTimeLimit(30000);
ctx.setRequestControls(null);
NamingEnumeration<?> namingEnum = root.search("", "(CN=Bob Test)", searchControls);

while (namingEnum.hasMore())
{
    SearchResult result = (SearchResult) namingEnum.next();
    Attributes attrs = result.getAttributes();
    IDActive = true;            
}

Это приводит к PartialResultException. Я могу искать в определенных местах, но я не знаю, как правильно «просачивать» мой поиск из корня, чтобы он мог проверить пользователя в любом поддомене. Спасибо


person Slenderbowman    schedule 26.07.2019    source источник


Ответы (1)


Если вам нужно выполнить поиск во всем лесу AD, это должно быть так же просто, как подключение к глобальному каталогу. Это так же просто, как изменить порт, к которому вы подключаетесь (если нет брандмауэра, блокирующего соединение):

ldap://1.1.1.20:3268

Глобальный каталог также использует протокол LDAP, но возвращает результаты для всего леса, а не только для домена сервера. Есть пара предостережений:

  1. Вы не можете вносить изменения в GC.
  2. Некоторые атрибуты не реплицируются в GC (например, accountExpires < / а>). Так что имейте в виду, что вы не можете получить все те же данные на GC, которые вы можете получить через обычный LDAP.

Если у вас есть какие-либо из этих проблем, вы можете получить distinguishedName из GC, а затем использовать его для привязки к объекту через обычный LDAP, чтобы либо изменить его, либо получить дополнительные данные, которые вам нужны.

person Gabriel Luci    schedule 26.07.2019
comment
Есть идеи, как подключиться к глобальному каталогу по протоколу GC? например GC: //1.1.1.20: 3268. Когда я пытаюсь подключиться к LDAP по протоколу GC, я получаю java.net.MalformedURLException: Not URL LDAP: - person A N; 28.01.2021
comment
@AN Нет протокола GC. GC по-прежнему использует LDAP. Достаточно указать порт: ldap://1.1.1.20:3268 Некоторые языки позволяют использовать GC:// вместо указания порта, но не Java. - person Gabriel Luci; 28.01.2021