powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск пользователей в Active Directory
7 сообщений из 7, страница 1 из 1
Поиск пользователей в Active Directory
    #37874166
a123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Существует настроенная active directory с деревом доменов
1
-1.1
-1.2
Ищу пользователей с помощью стандартного кода

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
   Hashtable env = new Hashtable();  // Hashtable!!! но InitialLdapContext понимает тока его :-(
    //Задаем параметры для входа в Active Directory
    String searchUserName = request.getParameter("userName");
    searchUserName = searchUserName.substring(searchUserName.indexOf("\\") + 1, searchUserName.length());
    String createUserEmail = null;

    String domainName = Config.getProperty("jcifs.smb.client.domain");  //IP домена
    String adminName = Config.getProperty("jcifs.smb.client.username") + "@" + domainName + ".ru"; //Имя пользователя для входа в домен
    String adminPassword = Config.getProperty("jcifs.smb.client.password");           //Пароль
    String ldapURL = "ldap://" + Config.getProperty("jcifs.http.domainController") + ":389";         //Хост:порт для подключения
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, adminName);
    env.put(Context.SECURITY_CREDENTIALS, adminPassword);
    env.put(Context.PROVIDER_URL, ldapURL);
    boolean found = false;
    boolean error = false;
    log.debug("----Start forming e-mail"+(new Date().toString()));
    try {
      //Создаем по заданным параметрам ldap context
      LdapContext ctx = new InitialLdapContext(env, null);

      //Задаем параметр для поиска во всех вложенных ветках
      SearchControls searchCtls = new SearchControls();
      searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

      //Устанавливаем фильтр для поиска
      String searchFilter = "(&(objectClass=user)(sAMAccountName=" + searchUserName + "))";

      // Specify the Base for the search
      Attributes attributes = ctx.getAttributes(ctx.getNameInNamespace());
      String searchBase = attributes.get("defaultNamingContext").get().toString();

      //Задаем перечень получаемых атрибутов - если null, то получаем все
      String returnedAtts[] = null;
      //{"sAMAccountName", "mail","userPrincipalName","distinguishedName"};
      searchCtls.setReturningAttributes(returnedAtts);
      //Получаем результат поиска
      NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);
      //Разбираем результат поиска, берем только первую запись если есть
      if (answer.hasMoreElements()) {
        found = true;
        SearchResult sr = (SearchResult) answer.next();
        Attributes attrs = sr.getAttributes();
        if (attrs.get("mail") != null) {//email не может быть пустым "" (вместо этого вернется null) или состоять из пробелов (не даст проверка валидности при сохранении)
          createUserEmail = attrs.get("mail").get().toString();
          log.debug("Found e-mail to use!"+createUserEmail);
        } else if (attrs.get("userPrincipalName") != null) {
          createUserEmail = attrs.get("userPrincipalName").get().toString();
          log.debug("Found userPrincipalName to use! (User found, e-mail not found)"+createUserEmail);
        } else if (attrs.get("distinguishedName") != null) { //это имя всегда есть в AD и оно уникально для всего дерева
          String domain = attrs.get("distinguishedName").get().toString();
          domain = domain.substring(domain.indexOf("DC=") + 3, domain.length());
          domain = domain.replace("DC=", ".").replace(",", "");
          createUserEmail = searchUserName + "@" + domain;
          log.debug("E-mail formed by using AD data! (User found, e-mail not found)"+createUserEmail);
        }
      } else {
        log.debug("User not found!");
      }
      ctx.close();
    } catch (Exception e) {
      log.error("Не удалось получить e-mail пользователя из Active Directory", e);
    }



Проблема: пользователи из домена 1 находятся, пользователи из дочерних доменов 1.1 и 1.2 не находятся (результат "User not found!"). SearchControls.SUBTREE_SCOPE вроде установлен
В чем может быть причина?
...
Рейтинг: 0 / 0
Поиск пользователей в Active Directory
    #37874242
silvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a123456, первое что в голову: "доверительные отношения"
...
Рейтинг: 0 / 0
Поиск пользователей в Active Directory
    #37874246
silvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldap брозверем искать пробовали?
...
Рейтинг: 0 / 0
Поиск пользователей в Active Directory
    #37874391
a123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доверительные отношения настроены в обе стороны между родительским и дочерними доменами. Так говорит админ.
silvanldap брозверем искать пробовали?
Не пробовала, т.к. доступа не имею. Админ говорит что пользователь adminName / adminPassword, указанный для аутентификации в домене имеет все права на поиск.
...
Рейтинг: 0 / 0
Поиск пользователей в Active Directory
    #37874446
silvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a123456, а как вы тестируетесь?!
в ldap браузер под этим пользователем войдите и поищите.
...
Рейтинг: 0 / 0
Поиск пользователей в Active Directory
    #37874451
silvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
silvanв ldap браузер под этим пользователем войдите и поищите. через ldap браузер конечно же.
возможно вы ищите только в одном домене а в другие даже не смотрите и нужно делать поиск по всему лесу
...
Рейтинг: 0 / 0
Поиск пользователей в Active Directory
    #37874484
a123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
silvan,

Тестируюсь на своей АД, где только один домен.
Поиск по всему лесу программно поидее задает параметр SearchControls.SUBTREE_SCOPE, который у меня установлен.
Поискать вручную возможности не имею, т.к. нет доступа к той АД
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск пользователей в Active Directory
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]