2011-04-15 83 views

Respuesta

10

Use Java JNDI, y realice una búsqueda de (objectclass = group) y solicite el atributo cn. Esto obtendrá el nombre de todos los grupos.

ejemplo Código:

import java.util.Hashtable; 

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; 

public class Test { 

    public static String ldapUri = "ldap://localhost"; 
    public static String usersContainer = "cn=users,dc=example,dc=com"; 

    public static void main(String args[]) { 

     if (args.length != 2) { 
      System.out.println("Usage: test userName password"); 
      return; 
     } 
     String username = args[0]; 
     String password = args[1]; 

     Hashtable env = new Hashtable(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, ldapUri); 
     env.put(Context.SECURITY_PRINCIPAL, username); 
     env.put(Context.SECURITY_CREDENTIALS, password); 
     try { 
      DirContext ctx = new InitialDirContext(env); 
      SearchControls ctls = new SearchControls(); 
      String[] attrIDs = { "cn" }; 
      ctls.setReturningAttributes(attrIDs); 
      ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE); 

      NamingEnumeration answer = ctx.search(usersContainer, "(objectclass=group)", ctls); 
      while (answer.hasMore()) { 
       SearchResult rslt = (SearchResult) answer.next(); 
       Attributes attrs = rslt.getAttributes(); 
       System.out.println(attrs.get("cn")); 
      } 

      ctx.close(); 

     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
+0

Gracias por la respuesta. Cuando intento usar esto, aparece el siguiente error: "javax.naming.NamingException: [LDAP: código de error 1 - 00000000: LdapErr: DSID-0C090627, comentario: para realizar esta operación, se debe completar un enlace correcto en la conexión ., data 0, vece "¿Alguna idea? – user709389

+0

Parece que no se ha autenticado correctamente. ¿Te estás conectando al servidor LDAP correcto? ¿Su usuario fdn es correcto (como cn = Administrador, cn = usuarios, dc = ejemplo, dc = com) y su contraseña es correcta? – kalyan

+0

Sí, mi pw estaba equivocado (soy estúpido). De todos modos, ahora tengo siguiente: "javax.naming.AuthenticationException: [LDAP: código de error 49 - 80090308: LdapErr: DSID-0C090334, comentario: error AcceptSecurityContext, datos 525, vece" – user709389

2

Puede utilizar esta biblioteca. Es fácil de usar y potente

http://code.google.com/p/jedi-obi/

+1

¿Está disponible en inglés? – ceving

+1

@ceving vea este enlace http://code.google.com/p/jedi-obi/ wiki/HomeUkVersion Pero solo esto, veo que todo el Java DOC está en inglés – Jacobi

0

utilicé el ejemplo de Kalyan para consultar los grupos de usuarios, pero se encontró que a pesar de la consulta trabajó, no devolvió todos los grupos de usuarios. Después de algunas excavaciones, me di cuenta del Catálogo Global de AD y basado en this example, pude modificar la respuesta de Kalyan para devolver todos los grupos de usuarios del catálogo global.

Los cambios requeridos fueron:

  1. Agregado puerto mundial 3268 al conjunto del primer parámetro ldapUri
  2. a Context.search a "".

    public static void main(String args[]) { 
        String ldapUri = "ldap://ad.domain.com"; 
    
        if (args.length != 2) { 
         System.out.println("Usage: test userName password"); 
         return; 
        } 
        String username = args[0]; 
        String password = args[1]; 
    
        Hashtable env = new Hashtable(); 
        env.put(Context.INITIAL_CONTEXT_FACTORY, 
          "com.sun.jndi.ldap.LdapCtxFactory"); 
        env.put(Context.PROVIDER_URL, ldapUri + ":3268"); 
        env.put(Context.SECURITY_PRINCIPAL, username); 
        env.put(Context.SECURITY_CREDENTIALS, password); 
        try { 
         DirContext context = new InitialDirContext(env); 
         SearchControls searchControls = new SearchControls(); 
         String[] attrIDs = {"cn"}; 
         searchControls.setReturningAttributes(attrIDs); 
         searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
    
         NamingEnumeration answer = context.search("", "(objectclass=group)", searchControls); 
         while (answer.hasMore()) { 
          SearchResult rslt = (SearchResult) answer.next(); 
          Attributes attrs = rslt.getAttributes(); 
          System.out.println(attrs.get("cn")); 
         } 
    
         context.close(); 
    
    
        } catch (NamingException e) { 
         e.printStackTrace(); 
        } 
    
    } 
    
Cuestiones relacionadas