2011-12-20 14 views
7

Tengo un script Perl que se une a un servidor LDAP y recupera todos los usuarios. Hasta ahora funciona bien, pero quiero filtrar esa búsqueda para reunir todos los grupos. Una vez que tenga todos los grupos, el usuario puede seleccionar uno de estos grupos y le mostraré solo los usuarios que sean miembros de ese grupo. ¿Cómo puedo hacer esas consultas? He probado esta:Cómo recuperar todos los grupos desde LDAP con Perl

my $mesg = $ldap->search(
    base => $base, 
    filter => '(objectclass=user)', 
    attrs => ['memberOf'] 
); 

Pero entonces algunos grupos se repiten y que tendrán que filtrar manualmente el resultado (y me gustaría evitar eso). ¿Y qué hay de la segunda consulta?

Respuesta

6

filtro cnThe para obtener todos los grupos es "(objectclass=group)" se puede retreive grupos en una sola organizationalUnit (scope => 'uno'), o en todo suborganización (scope => 'sub')

$mesg = $ldap->search( filter=>"(&(objectclass=group)(cn=the group choosen by the user)", 
         base=>"ou=Monou,dc=societe,dc=fr" 
         scope=>"sub" 
         attrs=> ['cn', 'member']); 
@entries = $mesg->entries; 
foreach $entry (@entries) 
{ 
    $entry->dump; 
    @member = $entry->get_value("member"); # returns all members 
} 

Para más ayuda, consulta An Introduction to perl-ldap


Editado

Entonces el filtro que estabas buscando es:

(&(objectClass=user)(memberof=CN=Mongroupe,OU=MonOU,DC=societe,DC=fr)) 
+0

La primera consulta funciona bien (recuperé todos los grupos) pero no puedo encontrar una manera de seleccionar usuarios de un grupo determinado, no hay ningún atributo de miembro. Intenté una consulta con * objectclass = usuario * y * memberOf = grupo elegido * pero no funciona :( – raz3r

+1

Gor un grupo dado, el atributo de miembro contiene el nombre de Distinguir de los miembros. – JPBlanc

+0

¡Lo tengo! Con su consulta me las arreglé recuperar todos los miembros de un grupo determinado, el único problema es que ahora solo tengo el CN ​​de los usuarios cuando en cambio quiero todos sus atributos. ¿Hay alguna manera de filtrarlo con objectclass = user? – raz3r

3

Use objectclass = * para obtener todo.

my $msg = $ldap->search(base => $dn, 
      scope => 'one', 
      filter => "(objectclass=*)"); 
$msg->all_entries;   
+0

Nice! ¿Y qué hay de mi segunda pregunta? ¿Cómo puedo seleccionar todos los usuarios de un grupo elegido? – raz3r

+0

Uhm .. esta búsqueda no devuelve grupos, está redefiniendo algo más pero no lo entiendo. ¿Estás seguro de que el alcance y el filtro son correctos? – raz3r

+0

El filtro aquí está devolviendo objetos de cada clase. Querrías un filtro más específico. Por ejemplo, '& (objectCategory = Group) (groupType: 1.2.840.113556.1.4.803: = 2147483648)' no solo obtendría grupos, sino que solo obtendría grupos de seguridad, no listas de distribución, en AD. – Mik

Cuestiones relacionadas