Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java AD / 9 сообщений из 9, страница 1 из 1
01.08.2012, 12:39:16
    #37900251
kazir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java AD
Добрый день, помогите, пожалуйста, вопрос наверняка банальный, но разобраться не получается.

Необходимо взять данные по юзерам, которые расположены в определенном OU. Делаю это следующим образом:

public class ADConnection {
public static Hashtable env = null;
public static DirContext ctx = null;

public static void main(String[] args) {
try {
env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://***:3268");
env.put(Context.SECURITY_PRINCIPAL, "***");
env.put(Context.SECURITY_CREDENTIALS, "***");
try {
ctx = new InitialDirContext(env);

SearchControls ctls = new SearchControls();
String[] attrIDs = { "employeeID", "employeeType",
"distinguishedName", "cn", "name", "mail", "memberOf",
"userPrincipalName" };

ctls.setReturningAttributes(attrIDs);
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration answer = ctx
.search("*****",
"(&(objectCategory=Person)(objectClass=user)(memberOf=***))", ctls);
while (answer.hasMore()) {
SearchResult rslt = (SearchResult) answer.next();
Attributes attrs = rslt.getAttributes();

Attribute employeeIDAttribute = attrs.get("employeeID");
if (employeeIDAttribute != null) {
for (int i = 0; i < employeeIDAttribute.size(); i++) {
System.out.println(" employeeID "
+ (String) employeeIDAttribute.get(i));
}
}
Attribute upnAttribute = attrs.get("userPrincipalName");
if (upnAttribute != null) {
for (int i = 0; i < upnAttribute.size(); i++) {
System.out.println(" userPrincipalName "
+ (String) upnAttribute.get(i));
}
}
}

} catch (NamingException e) {
e.printStackTrace();
}
ctx.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
}

параллельно, я смотрю на пользователей через ADExplorer, вижу там атрибут employeeID и вижу, что он заполнен.

Attribute upnAttribute = attrs.get("userPrincipalName"); - возвращается корректно
Attribute employeeIDAttribute = attrs.get("employeeID"); - возвращает null

Пожалуйста, подскажите в чем проблема, заранее благодарна за ответ.
...
Рейтинг: 0 / 0
01.08.2012, 14:55:47
    #37900506
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java AD
В целом код походит на правильный. ADExplorer и выше приложение используют одну и ту же учетную запись?
Как вариант можно в returninAttributes засунуть null и потом в цикле вывести rslt.getAttributes().getAll().
...
Рейтинг: 0 / 0
01.08.2012, 15:00:51
    #37900519
kazir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java AD
just_vladimir,

ADExplorer и выше приложение используют одну и ту же учетную запись? - конечно:)
Как вариант можно в returninAttributes засунуть null и потом в цикле вывести rslt.getAttributes().getAll() - попробовала, атрибуты employeeID и employeeType не возвращаются. Не знаю что делать.
...
Рейтинг: 0 / 0
01.08.2012, 15:11:38
    #37900540
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java AD
kazir,

тогда подозреваю надо смотреть настройки самой AD, в остальном код у вас рабочий (ну есть нюанс, что в случае если записей > 1000 то код нужно будет немного модифицировать, но к данному вопросу это не имеет отношения).
...
Рейтинг: 0 / 0
01.08.2012, 18:28:07
    #37900901
kazir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java AD
just_vladimir, была бы очень благодарна, если подскажете ссылку на пример про больше 1000 записей. Я первый раз работаю с AD.
Кто-то сможет подсказать что надо смотреть в AD, потому что админы AD говорят, что все посмотрели и проблемы на нашей стороне. Типа если я вижу все остальные атрибуты, то и employeeID должна видеть.
...
Рейтинг: 0 / 0
01.08.2012, 18:40:26
    #37900919
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java AD
kazir,
нужен пейджинг запросов, в принципе гуглится без проблем, но мне не сложно выложить код:
Код: 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.
public List<LdapUser> searchLdapUsers(String baseDN, String query) throws NamingException, IOException {

		List<LdapUser> result = new LinkedList<LdapUser>();

		SearchControls searchControls = new SearchControls();
		searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

		byte[] cookie = null;

		do {
			NamingEnumeration<SearchResult> searchResult = ctx.search(baseDN, query, searchControls);
			while (searchResult != null && searchResult.hasMore()) {
				SearchResult entry = (SearchResult) searchResult.next();				
				LdapUser user = extractUser(entry.getAttributes());
				result.add(user);
			}
			Control[] controls = ctx.getResponseControls();
			if (controls != null) {
				for (int i = 0; i < controls.length; i++) {
					if (controls[i] instanceof PagedResultsResponseControl) {
						PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i];
						cookie = prrc.getCookie();
					}
				}
			} else {
				System.out.println("No controls were sent from the server");
			}
			ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, cookie, Control.CRITICAL) });
		} while (cookie != null);

		return result;
	}


Здесь LdapUser это обычный POJO класс, а extractUser метод собирающий объект этого POJO из SearchResult.
...
Рейтинг: 0 / 0
01.08.2012, 23:07:30
    #37901090
kazir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java AD
just_vladimir, спасибо, понятно, будем делать так.
Но собственно вопрос остается не отвеченным.
...
Рейтинг: 0 / 0
02.08.2012, 13:08:32
    #37901829
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java AD
kazir,
на мой взгляд в Java коде все корректно, так что здесь вам врядли еще чем то смогут помочь, сходите в раздел по администрированию windows http://www.sql.ru/forum/actualtopics.aspx?bid=27, может там что подскажут.
По играйте с правами пользователя, по изменяйте сам ldap запрос, посмотрите какие запросы посылает ADExlorer.
...
Рейтинг: 0 / 0
15.08.2012, 09:19:00
    #37916954
kazir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java AD
Сама разобралась, напишу на тот случай, если кому-то пригодится. Проблема была в том, что я обращалась к глобальному каталогу, а не напрямую в нужный контроллер домена. Не все атрибуты юзера реплицируются в глобальный каталог, employeeId не реплицируется. Для того чтобы получить полный набор надо в глобальном каталоге взять dn, а по нему уже взять сам объект юзера.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Java AD / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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