Queries LDAP

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. :wink:

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.