Здравствуйте, необходимо реализовать программу которая будет искать пользователя в AD.
Нашел пример
тут
Переделал под себя, вот что у меня получилось:
package ru.domen;
import java.util.Hashtable;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
class TestAD
{
static DirContext ldapContext;
public static void main (String[] args) throws NamingException
{
try
{
String userName = "test1";
String passWord = "123467";
String base = "OU=Клиенты,DC=domen,DC=ru";
String dn = "uid=" + userName + "," + base;
String ldapURL = "ldap://host:389/";
ldapURL += base;
Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
;
ldapEnv.put(Context.PROVIDER_URL, ldapURL);
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
ldapEnv.put(Context.SECURITY_PRINCIPAL, userName);
ldapEnv.put(Context.SECURITY_CREDENTIALS, passWord);
//ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=administrateur,cn=users,dc=societe,dc=fr");
// ldapEnv.put(Context.SECURITY_PRINCIPAL, "OU=Клиенты,DC=domen,DC=ru");
// ldapEnv.put(Context.SECURITY_CREDENTIALS, "pwd");
//ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
//ldapEnv.put(Context.SECURITY_PROTOCOL, "simple");
ldapContext = new InitialDirContext(ldapEnv);
// Create the search controls
SearchControls searchCtls = new SearchControls();
//Specify the attributes to return
String returnedAtts[] = {"sn", "givenName", "sAMAccountName"};
searchCtls.setReturningAttributes(returnedAtts);
//Specify the search scope
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
//specify the LDAP search filter
String searchFilter = "sAMAccountName=5836";
//Specify the Base for the search
String searchBase = "OU=Клиенты,DC=domen,DC=ru";
//initialize counter to total the results
int totalResults = 0;
// Search for objects using the filter
NamingEnumeration<SearchResult> answer = ldapContext.search(searchBase, searchFilter, searchCtls);
//Loop through the search results
while (answer.hasMoreElements()) {
SearchResult sr = (SearchResult) answer.next();
totalResults++;
System.out.println(">>>" + sr.getName());
Attributes attrs = sr.getAttributes();
System.out.println(">>>>>>" + attrs.get("sAMAccountName"));
}
System.out.println("Total results: " + totalResults);
ldapContext.close();
} catch (Exception e) {
//System.out.println(" Search error: " + e);
e.printStackTrace();
System.exit(-1);
}
}
}
Вот что получается после выполнения программы:
javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-03100238, problem 2001 (NO_OBJECT), data 0, best match of:
'OU=Клиенты,DC=domen,DC=ru'
]; remaining name 'OU=Клиенты,DC=domen,DC=ru'
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3160)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3081)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2888)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1846)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1769)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:392)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:358)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:341)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
at ru.domen.TestAD.main(TestAD.java:75)
Java Result: -1
Что я делаю не так, в чем может быть проблема?
Заранее большое спасибо!