2008-10-28 40 views
5

Tengo problemas para ejecutar una consulta compleja contra el servidor LDAP de nuestra compañía. Estoy usando el siguiente script Perl:¿Cómo hago una consulta compleja con Perl's Net :: LDAP?

use Data::Dumper; 
use Net::LDAP; 

die "Can't connect to LDAP-Server: [email protected]\n" 
    unless $ldap = Net::LDAP->new('xLDAPx'); 


foreach my $filter ('ou=Personal', 'ou=BAR', 'ou=Personal,ou=BAR', 'ou=Personal,ou=FOO,o=FOO,dc=foo,dc=com') 
{ 
    $mesg = $ldap->search(base => "o=FOO,dc=foo,dc=com", filter => $filter); 
    print Dumper($mesg), "\n\n"; 
} 

Mientras que el primero de dos filtros de trabajo (como en la devolución de los valores esperados) el último y complejo no lo hace. Devuelve una matriz vacía. Lo que realmente me desconcierta es que exactamente la misma cadena de consulta funciona cuando la uso con una herramienta como el navegador Softerra LDAP.

También he intentado la misma consulta usando PHP ldap_search & co, en vano.

¿Alguien puede arrojar algo de luz sobre esto?

Gracias por leer

holli

Editar: Esta es la estructura del servidor:

Server 
    ou=FOO 
     ou=... 
     ou=Personal 
      uid=something 

necesito una lista de fluidos.

+0

Siempre 'use strict;' y 'use warnings;'. –

Respuesta

5

Creo que quieres que sea más como (&(ou=Personal)(ou=FOO)(o=FOO)(dc=foo)(dc=com)). Pero no está nada claro sobre lo que quiere exactamente, así que no puedo hacer un filtro para usted.

Editado para añadir: Supongo que esto es lo que quiere hacer: (|(ou=Personal)(ou=FOO))

+0

Ningún objeto individual en LDAP coincidirá con dicho filtro. Además, te estás perdiendo un cierre paren. :-) – Tomalak

+0

Probablemente no, aunque puede coincidir, era solo un ejemplo sintáctico. Como dije, no me queda claro por la pregunta qué quiere exactamente. –

4

El motivo es que no proporciona cadenas de filtro sintácticamente correctas, sino partes de un DN. No me puedo imaginar que esto funcione en el navegador Ldap. Simplemente lo intenté sin éxito.

Las dos primeras son cadenas de filtro correctas. Filtran en un solo atributo de objeto en una moda "({attribute} = {value})". El primero ("ou = Personal") devolvería cualquier OU llamada "Personal" dentro de su base de búsqueda.

Si explica con más detalle lo que está tratando de encontrar, probablemente pueda decirle qué expresión de filtro necesita.

+0

agregó estructura de servidor al OP – holli

+0

Lo siento, pero la pregunta aún no está clara. ¿Qué son los "fluidos" en su contexto? ¿Objetos por derecho propio o atributos de diferentes objetos? – Tomalak

2

escribir un filtro que se ajusta a RFC 2254 y luego ver qué pasa. No necesita una consulta compleja, quiere un atributo para cada entrada en una rama. Mira el argumento attrs para el método de búsqueda.

Cuestiones relacionadas