Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск пользователей в Active Directory 
:(
    Опции темы
Veroonya
Дата 11.7.2012, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 10.10.2008
Где: Россия, Омск

Репутация: нет
Всего: 1



Существует настроенная active directory с деревом доменов
1
-1.1
-1.2
Ищу пользователей с помощью стандартного кода

Код

   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 вроде установлен
В чем может быть причина?

Это сообщение отредактировал(а) Veroonya - 11.7.2012, 05:19
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0947 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.