#java #active-directory #ldap
Вопрос:
Я много искал в Google и видел несколько похожих ответов на этом сайте, но у меня ничего не работает.
Я пытался выполнить поиск ActiveDirectory с помощью LDAP. Поиск выполняется нормально, но он никогда не возвращает результатов. Я ищу по userPrincipalName, и этот пользователь абсолютно существует в ActiveDirectory.
String securityPrincipal;
securityPrincipal = "{0}@" "ourcompany";
securityPrincipal = MessageFormat.format(securityPrincipal, username);
Hashtable<String,Object> env = new Hashtable<>();
env.put(Context.PROVIDER_URL, "ldaps://OURCOMPANY:636");
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
//Internal and external the same
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, securityPrincipal);
env.put(Context.SECURITY_CREDENTIALS, password);
env.put(Context.REFERRAL,"follow");
boolean success;
LdapContext ldapCtx = null;
try {
ldapCtx = new InitialLdapContext(env, null);
success = true;
} catch (NamingException ex) {
ex.printStackTrace();
success = false;
if(ldapCtx != null){
doSearch(ldapCtx)
}
private static final void doSearch(LdapContext ctx) throws NamingException{
NamingEnumeration results = null;
String domain = "DC=ourcompany,DC=com";
String organizationalUnit = "ou=external";
String searchUser;
searchUser = "cdanvers@ourcompany.com";
try {
DirContext schema = ctx.getSchema("");
String[] returning = {"userPrincipalName"};
SearchControls ctrls = new SearchControls();
ctrls.setSearchScope(SearchControls.SUBTREE_SCOPE);
ctrls.setReturningAttributes(returning);
Attributes attributes = new BasicAttributes(true);
attributes.put("userPrincipalName",searchUser);
results = ctx.search(organizationalUnit "," domain,attributes);
while (results.hasMoreElements()){
System.out.println("...");
}
System.out.println(results.hasMore());
}catch (NamingException ex){
ex.printStackTrace();
} finally {
results.close();
}
В дополнение к тому, что указано выше, я пытался:
- Использование этого типа поиска:
results = ctx.search(organizationalUnit "," domain,"(amp; (userPrincipalName=" searchUser "))",ctrls);
- Использование этого типа поиска:
results = ctx.search(domain,"(amp; (userPrincipalName=" searchUser "))",ctrls);
- Передача null в
ctrls.setReturningAttributes()
ctrls.setSearchScope(SearchControls.OBJECT_SCOPE);
Это должно возвращать результаты. Значение Results не равно null, но results.entries() пусто.
Комментарии:
1. У вас есть надлежащие разрешения? Я бы посоветовал вам использовать известный хороший инструмент ldap, такой как ldapsearch или directory.apache.org/studio чтобы проверить ваш поиск
2. Я попробую это. Я думаю, что у меня есть надлежащие разрешения, но не уверен. Я подозревал, что некоторые из моих проблем связаны с разрешениями, но я не понял, как это точно выяснить.
3. Я загрузил Apache Directory Studio, как вы предложили. Это доказало свою ценность. Я не мог разобраться в своей проблеме, но, пытаясь, я понял, что не думаю, что мне это нужно. Я начал пытаться реализовать поиск для изучения LDAP, и моей реальной целью была запись в него данных. Не знаю, почему мне потребовалось так много времени, чтобы понять это. Мои разрешения в порядке. Проблема на самом деле не решена, но я думаю, что она перестала быть проблемой.