E aí pessoal, tudo certo?
Não sei se a sessão “Java Avançado” é a mais adequada pra essa dúvida, já que não é uma dúvida de Java propriamente dita…
Meu problema é o seguinte: acesso um servidor LDAP via JNDI pra fazer algumas queries e consigo fazer coisas como retornar todos os usuários ou todos os grupos. No entanto, preciso retornar, para cada grupo do servidor LDAP, a lista de usuários membros.
Tentei isso com as sequintes queries:
(&(objectClass=group)(member=nomeUsuario))
e
(&(objectClass=user)(memberOf=nomeGrupo))
Porém essas consultas não retornam dados (executei elas no gerenciador gráfico do AD e também não retornam nada lá).
Alguém sabe um modo fácil de listar todos os usuários de um grupo via LDAP?
Obrigado. 
Para retornar todos usuários de um determinado grupo:
String entryDN = "CN=MeuGrupo,OU=Sistemas,DC=empresa,DC=com,DC=br";
String searchPath = "DC=empresa,DC=com,DC=br";
NamingEnumeration results = null;
DirContext ctx = new InitialDirContext(env); //Aqui vai o Map com as informações
//de conexão e autenticação
SearchControls search = new SearchControls();
search.setSearchScope(SearchControls.SUBTREE_SCOPE);
results = ctx.search(path, "(&(objectClass=user)(memberOf=" + entryDN + "))", search);
while (results.hasMore()) {
SearchResult searchResult = (SearchResult) results.next();
Attributes attributes = searchResult.getAttributes();
Attribute attrCN = attributes.get("cn"); //capturando o CommonName do usuário
System.out.println(attrCN.get());
}
ctx.close();
Para buscar todos os grupos de um determinado usuário:
String entryDN = "dc=Empresa,dc=com,dc=br";
String uniqueMember="cn=usuario,ou=Usuarios,dc=Empresa,dc=com,dc=br";
DirContext ctx = new InitialDirContext(env);
NamingEnumeration results = null;
SearchControls search = new SearchControls();
search.setSearchScope(SearchControls.SUBTREE_SCOPE);
results = ctx.search(entryDN, "(&(objectClass=group)(member=" + uniqueMember + "))",
search);
while (results.hasMore()) {
SearchResult searchResult = (SearchResult) results.next();
Attributes attributes = searchResult.getAttributes();
Attribute attr = attributes.get("cn"); //Recuperando o CommonName do grupo
System.out.println(attr.get());
}
ctx.close();
Ps: Pelos nomes da estrutura, deu pra notar que esta busca é implementada utilizando o ActiveDirectory da MS
Obrigado pela resposta, Rafael.
Tentei executar essas buscas e ocorre sempre o mesmo erro, na chamada da query (ctx.search):
javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name ‘DC=skynet,DC=com,DC=br’
O que pode estar acontecendo?
Outra dúvida: como obter uma lista de todos os atributos que posso obter para um grupo ou usuário?
Em relação ao primeiro problema, tenta colocar um caminho de busca mais específico.
Tipo o caminho da Unidade Organizacional(ou) dos usuário:
String searchPath= "ou=Usuarios,DC=skynet,DC=com,DC=br";
E em relação a segunda pergunta, você precisa de uma ferramenta que te liste esses atributos, tipo o Hyena para o Active Directory. Ou lendo a documentação no site da Microsoft.
Aqui nestes links tem alguns, não sei se estão listados todos:
http://www.kouti.com/tables/userattributes.htm
http://support.microsoft.com/kb/257218
http://www.winzero.ca/Active-Directory-groups.htm
Havia um erro no caminho de busca, por isso estava dando erro na chamada do método search.
Entretanto, continuo recebendo a mesma excessão (javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name ‘DC=skynet,DC=com,DC=br’).
Inicialmente eu busco todos os grupos do servidor. Após isso, para cada grupo, busco os usuários (estou usando o nome completo do grupo, ex: CN=HelpServicesGroup,CN=Users,DC=skynet,DC=com,DC=br).
O erro agora ocorre no looping feito nos resultados:
-> while (results.hasMore()) {
SearchResult searchResult = (SearchResult) results.next();
Attributes attributes = searchResult.getAttributes();
Attribute attrCN = attributes.get("cn");
System.out.println("********* user: " + attrCN.get());
}
Ele pega o primeiro usuário do grupo, mas lança o erro na segunda iteração. Alguma idéia?
Bom, pesquisando na internet vi que trocar a porta de conexão ao LDAP para a porta 3268 elimina esse erro. ¬¬
O interessante é que ele não está retornando todos os usuários. Não dá erro, mas simplesmente ignora alguns…
3268 é a busca pelo Global Catalog do AD.
Quanto ao retorno dos usuários, quantos são?
O AD pode estar configurado(creio que a configuração default) para limitar a quantidade de registros num retorno de uma busca, já tive de aumentar essa limitação algumas vezes.
[edit]
No servidor onde está o AD, execute o ntdsutil.exe. Entre no console do LDAP Policy e troca o atributo MaxPageSIze para o tamanho que você necessita
O servidor que estou testando está “zerado”, em uma máquina virtual que uso para testes. O AD que está instalado nela possui apenas os usuários padrão e mais um que eu criei.
De qualquer forma, executei essa alteração, mas não surtiu efeito.
Usuários que a consulta pelo java retorna:
SUPPORT_388945a0
Administrador
Convidado
Usuários que estão cadastrados no AD (retornados com uma query (objectClass=user)):
SUPPORT_388945a0
Administrador
Convidado
krbtgt
Lucas
Obs: Todos os usuários são membros de pelo menos um grupo.