Существует настроенная 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
|