Запрос для АКТИВНЫХ пользователей на сервере LDAP НЕ работает

Мне нужно получить через запрос активного каталога с помощью сервера LDAP список определенных АКТИВНЫХ пользователей из активного каталога.

Я попытался сделать это через успешное подключение к моему серверу ldap. В приведенном ниже java-коде я возвращаю ТОЛЬКО 1 запись при использовании атрибута accountExpires. Я должен получить список записей с каждой записью, отображающей ИМЯ ДИСПЛЕЯ и атрибут ПОЧТА с сервера ldap.

Вот мой код:

public static void main(String[] args) {
    ADUserAttributes adUserAttributes = new ADUserAttributes();
    adUserAttributes.getLdapContext());
    adUserAttributes.getActiveEmpRecordsList("0", adUserAttributes.getLdapContext());
}

public LdapContext getLdapContext(){
    LdapContext ctx = null;
    try{
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "Simple");
        env.put(Context.SECURITY_PRINCIPAL, "e~inventory"); 
        env.put(Context.SECURITY_CREDENTIALS, "password");
        env.put(Context.PROVIDER_URL, "ldap://xxxdc01.txh.org");
        ctx = new InitialLdapContext(env, null);
        System.out.println("Connection Successful.");
    } catch(NamingException nex){
        System.out.println("LDAP Connection: FAILED");
        nex.printStackTrace();
    }
    return ctx;
}

private List<String> getActiveEmpRecordsList(String accountExpires, LdapContext ctx) {
List<String> activeEmpAttributes = new ArrayList<String>();
Attributes attrs = null;
try {
    SearchControls constraints = new SearchControls();
    constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
    String[] attrIDs = {"displayname", "mail"};
    constraints.setReturningAttributes(attrIDs);
    NamingEnumeration answer = ctx.search("DC=txh,DC=org", "accountExpires=" + accountExpires, constraints);
    if (answer.hasMore()) {
        attrs = ((SearchResult) answer.next()).getAttributes();
        int empNameLen = attrs.get("displayname").toString().length();
        int empEmailAddrLen = attrs.get("mail").toString().length();
        activeEmpAttributes.add(attrs.get("displayname").toString().substring(13, empNameLen));
        activeEmpAttributes.add(attrs.get("mail").toString().substring(6, empEmailAddrLen));
        ctx.close();
    }else{
        throw new Exception("Invalid User");
    }
    System.out.println("activeEmpAttributes: " + activeEmpAttributes);
    System.out.println("count: " + activeEmpAttributes.size());
} catch (Exception ex) {
    ex.printStackTrace();
}
return activeEmpAttributes;
 }

person Melinda    schedule 17.10.2011    source источник


Ответы (1)


Для поиска можно использовать PrincipalSearcher и принципал "запрос по примеру":

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// define a "query-by-example" principal - here, we search for active UserPrincipals
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.Enabled = true;

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
}

Если вы еще этого не сделали, обязательно прочтите статью MSDN Управление участниками безопасности каталогов в. NET Framework 3.5, в которой хорошо показано, как наилучшим образом использовать новые функции System.DirectoryServices.AccountManagement

Вы можете указать любые свойства в UserPrincipal и использовать их как «запрос по примеру» для своего PrincipalSearcher.

person marc_s    schedule 17.10.2011
comment
Марк - спасибо за дополнительную информацию. Наконец-то я смог заставить свой исходный запрос работать. Спасибо за ссылку на статью MSDN. Отличная информация. Цени свое время. - person Melinda; 19.10.2011
comment
@Melinda: пожалуйста, возьмите за привычку принимать лучший из предоставленных ответов, решающий вашу проблему. Это правильный и вежливый поступок в StackOverflow, который побуждает других продолжать помогать тем, кто ищет ответы. См. ответы на часто задаваемые вопросы - person marc_s; 19.10.2011