Vale, aqui va con un poco mas de detalle:

Lo del strict: poner al principio del script la linea "use strict;". Si quieres, justo antes de la linea donde usas el LDAP_CONTROL_PAGED puedes poner una linea "no strict subs;" para evitar que dé ese error ahí.

Para hacer un volcado del array de configuracion:

Pon al principio del script la linea "use Data::Dumper;". Despues, justo antes de la llamada a $ldap->search pon una linea "print Dumper(\@args);"

Para volcar $mesg y $ldap puedes hacerlo de la misma forma:

print Dumper($mesg);
print Dumper($ldap);

Data::Dumper entiende los formatos de las referencias y te dará la informacion que buscas.

Slds
Jorge

El 20/09/11 14:18, David Barrientos J escribió:
Estoy un poco perdido con todo esto. He intentado ponerle strict ( aunque no seria la solución, tal vez podría darme una idea de donde estoy fallando ), pero no puedo ponerlo, me da el siguiente error:

Bareword "LDAP_CONTROL_PAGED" not allowed while "strict subs" in use

En cuanto a lo que me comentas de volcar los argumentos de la llamada $mesg = $ldap->search ( @args ) or die $!;, no se si te estoy entendiendo bien:

@args tiene el contenido que debe tener, lo he comprobado sobre la ejecución, ¿Te refieres a esto? No soy un guru con perl(aún :) ),no sé si podría mirar de alguna forma los contenidos de $mesg y $ldap, son referencias y no sé cómo acceder a los datos en si, claro, al hacer un print $mesg o print $ldap, obtengo esto:

Net::LDAP::Search=HASH(0xdbe064)
Net::LDAP=HASH(0xd391bc)


El 20 de septiembre de 2011 13:18, <[email protected] <mailto:[email protected]>> escribió:

    Envíe los mensajes para la lista Madrid-pm a
    [email protected] <mailto:[email protected]>

    Para subscribirse o anular su subscripción a través de la WEB
    http://mail.pm.org/mailman/listinfo/madrid-pm

    O por correo electrónico, enviando un mensaje con el texto "help" en
    el asunto (subject) o en el cuerpo a:
    [email protected] <mailto:[email protected]>

    Puede contactar con el responsable de la lista escribiendo a:
    [email protected] <mailto:[email protected]>

    Si responde a algún contenido de este mensaje, por favor, edite la
    linea del asunto (subject) para que el texto sea mas especifico que:
    "Re: Contents of Madrid-pm digest...". Además, por favor, incluya en
    la respuesta sólo aquellas partes del mensaje a las que está
    respondiendo.


    Asuntos del día:

      1. consulta masiva a directorio activo (David Barrientos J)
      2. Re: consulta masiva a directorio activo (Jorge Gonzalez)


    ----------------------------------------------------------------------

    Message: 1
    Date: Tue, 20 Sep 2011 12:43:22 +0200
    From: David Barrientos J <[email protected]
    <mailto:[email protected]>>
    To: [email protected] <mailto:[email protected]>
    Subject: [Madrid-pm] consulta masiva a directorio activo
    Message-ID:
    <CADC4WV70DHVrY70J=ABfvp4+oeM=cmds1nljfso9g8lw1hy...@mail.gmail.com 
<mailto:[email protected]>>
    Content-Type: text/plain; charset="iso-8859-1"

    Hola! Os escribo para ver si alguien me puede echar una mano:
    Necesito hacer
    un script que descargue de forma masiva ciertos datos de todos los
    usuarios
    de un directorio activo de microsoft. Mi script se ejecuta asi:

    ./script.pl <http://script.pl> [fichero_configuracion] [dominio]

    Primero, lee del fichero de configuracion sus dos lineas: Usuario, y
    contraseña. Despues es donde viene el problema. En la parte de la
    autenticación ( la linea que pongo en negrita ) no entra en el
    bucle, no
    consulta ningun dato.
    Esto es muy raro, el código de la función busca() , si lo pego en otro
    script nuevo, sin funciones, y con la password y usuario en el
    fichero,
    funciona todo perfecto. Tal y como esta.
    Pero, al leer usuario y pass de un fichero y usar funciones, falla
    en la
    consulta. Y he comprobado haciendo un print las variables usuario,
    password,
    ldaps,que todos los valores los toma bien.

    Y es que ya no se ni que mirar, no entiendo que me puede estar
    pasando, si
    el codigo está bien!
    ¿Alguien me puede echar una mano?No sé , ¿Estoy haciendo algo mal?

    Gracias, saludos!

    #!c:\perl\bin\perl.exe -w

    use 5.010;
    use Net::LDAP;
    use Net::LDAP::Control;
    use Net::LDAP::Control::Paged;
    use MIME::Base64;
    use open qw(:utf8 :std);

    my $siguiente = '0';
    my $ldaps = "$ARGV[1]";
    my $configuracion = "$ARGV[0]";
    open CONFIG, q[<], "$configuracion" or die "No puedo leer el
    fichero de
    configuracion $!";
    open REPORTE, q[>], "reporteee.txt" or die "No puedo escribir el
    fichero
    $ARGV[1].txt $!";
    my $base = 'DC=espana5,DC=bankia,DC=corp';

    sub conviertefecha{
       my $fecha_desordenada = shift;
       my @empieza = qw(0 4 6 8 10 12);
       foreach my $comienzo(@empieza){
           if ($cont == '1'){
               $despiezando = substr($fecha_desordenada,$comienzo,4);
               push(@array,$despiezando);
               ++$cont;next;
           }
           $despiezando = substr($fecha_desordenada,$comienzo,2);
           $cont++;
           push(@array,$despiezando);
       }
       $fecha_ordenada = "$f[2]/$f[1]/$f[0] $f[3]:$f[4]:$f[5]";
       return $fecha_ordenada;
       undef @array;
    }
    sub busca{
       my ($us,$pass) = @_;
       my $query = "cn=x0*";
       say "$query";
       my @attrs = qw(cn sAMAccountName memberof department);
       say "defini arr";
       my @args = ( base => $base,
                    #scope => 'sub',
                    filter => $query,
                    attrs => \@attrs,
                    control => [ $page ],
                   );
       my $ldap = Net::LDAP->new($ldaps) or die "$!";
       say "Conectando a $ldaps";
       my $mesg = $ldap->bind($us, password =>$pass);
       my $page = Net::LDAP::Control::Paged->new( size => 5000 ) or
    die "$!";
       my $cookie;
       say "$base-----$query------$page------$ldaps----$us----$pass--";
       while(1){
       say "Entre en while1";
           $mesg = $ldap->search ( @args ) or die $!;
          * while(my $entry = $mesg->shift_entry()){* ## Aqui no entra
           say "Entre en while";
               my $lastLogonTimestamp =
    $entry->get_value('lastLogonTimestamp');
               $lastLogonTimestamp = &conviertefecha($lastLogonTimestamp);
               my $msdsuaccountctrl =
    $entry->get_value('msds-user-account-control-computed');
               my $departmento = $entry->get_value('department');
               say REPORTE
    "$lastLogonTimestamp,$msdsuaccountctrl,$departmento";
           }
           my ($resp) = $mesg->control(LDAP_CONTROL_PAGED) or last;
           $cookie = $resp->cookie or last;
           $page->cookie($cookie);
       }
       if ($cookie){
           $page->cookie($cookie);
           $page->size(0);
           $ldap->search( @args );
       }
       $ldap->unbind;
    }
    unless ( @ARGV eq '2' ){
       say "[SYNTAX ERROR]\n[INFO] ./$0 [fichero_configuracion]
    [dominio]";
       exit(1);
    }
    while(my $linea=<CONFIG>){
       chomp($linea);
       if($siguiente eq '1'){
           $passwd = $linea;
    &busca($user,$passwd);
           exit(0);
       }
       $user = $linea;
       $siguiente = '1';
    }
    ------------ próxima parte ------------
    Se ha borrado un adjunto en formato HTML...
    URL:
    
<http://mail.pm.org/pipermail/madrid-pm/attachments/20110920/636be65f/attachment-0001.html>

    ------------------------------

    Message: 2
    Date: Tue, 20 Sep 2011 13:18:18 +0200
    From: Jorge Gonzalez <[email protected]
    <mailto:[email protected]>>
    To: [email protected] <mailto:[email protected]>
    Subject: Re: [Madrid-pm] consulta masiva a directorio activo
    Message-ID: <[email protected]
    <mailto:[email protected]>>
    Content-Type: text/plain; charset="utf-8"; Format="flowed"

    En la linea previa a esa en la que no entras, hay una llamada a
    $ldap->search. Yo volcaría los argumentos de esa llamada para
    asegurarme
    de que realmente la llamada a $ldap->search devuelve algo. Quiza no
    entras porque la busqueda no devuelve resultados.

    También te recomiendo que uses strict al principio del script, me ha
    parecido ver alguna variable no inicializada por ahi...

    Slds
    J.

    El 20/09/11 12:43, David Barrientos J escribió:
    > Hola! Os escribo para ver si alguien me puede echar una mano:
    Necesito
    > hacer un script que descargue de forma masiva ciertos datos de todos
    > los usuarios de un directorio activo de microsoft. Mi script se
    > ejecuta asi:
    >
    > ./script.pl <http://script.pl> <http://script.pl>
    [fichero_configuracion] [dominio]
    >
    > Primero, lee del fichero de configuracion sus dos lineas: Usuario, y
    > contraseña. Despues es donde viene el problema. En la parte de la
    > autenticación ( la linea que pongo en negrita ) no entra en el
    bucle,
    > no consulta ningun dato.
    > Esto es muy raro, el código de la función busca() , si lo pego
    en otro
    > script nuevo, sin funciones, y con la password y usuario en el
    > fichero, funciona todo perfecto. Tal y como esta.
    > Pero, al leer usuario y pass de un fichero y usar funciones,
    falla en
    > la consulta. Y he comprobado haciendo un print las variables
    usuario,
    > password, ldaps,que todos los valores los toma bien.
    >
    > Y es que ya no se ni que mirar, no entiendo que me puede estar
    > pasando, si el codigo está bien!
    > ¿Alguien me puede echar una mano?No sé , ¿Estoy haciendo algo mal?
    >
    > Gracias, saludos!
    >
    > #!c:\perl\bin\perl.exe -w
    >
    > use 5.010;
    > use Net::LDAP;
    > use Net::LDAP::Control;
    > use Net::LDAP::Control::Paged;
    > use MIME::Base64;
    > use open qw(:utf8 :std);
    >
    > my $siguiente = '0';
    > my $ldaps = "$ARGV[1]";
    > my $configuracion = "$ARGV[0]";
    > open CONFIG, q[<], "$configuracion" or die "No puedo leer el fichero
    > de configuracion $!";
    > open REPORTE, q[>], "reporteee.txt" or die "No puedo escribir el
    > fichero $ARGV[1].txt $!";
    > my $base = 'DC=espana5,DC=bankia,DC=corp';
    >
    > sub conviertefecha{
    >     my $fecha_desordenada = shift;
    >     my @empieza = qw(0 4 6 8 10 12);
    >     foreach my $comienzo(@empieza){
    >         if ($cont == '1'){
    >             $despiezando = substr($fecha_desordenada,$comienzo,4);
    >             push(@array,$despiezando);
    >             ++$cont;next;
    >         }
    >         $despiezando = substr($fecha_desordenada,$comienzo,2);
    >         $cont++;
    >         push(@array,$despiezando);
    >     }
    >     $fecha_ordenada = "$f[2]/$f[1]/$f[0] $f[3]:$f[4]:$f[5]";
    >     return $fecha_ordenada;
    >     undef @array;
    > }
    > sub busca{
    >     my ($us,$pass) = @_;
    >     my $query = "cn=x0*";
    >     say "$query";
    >     my @attrs = qw(cn sAMAccountName memberof department);
    >     say "defini arr";
    >     my @args = ( base => $base,
    >                  #scope => 'sub',
    >                  filter => $query,
    >                  attrs => \@attrs,
    >                  control => [ $page ],
    >                 );
    >     my $ldap = Net::LDAP->new($ldaps) or die "$!";
    >     say "Conectando a $ldaps";
    >     my $mesg = $ldap->bind($us, password =>$pass);
    >     my $page = Net::LDAP::Control::Paged->new( size => 5000 ) or
    die "$!";
    >     my $cookie;
    >     say "$base-----$query------$page------$ldaps----$us----$pass--";
    >     while(1){
    >     say "Entre en while1";
    >         $mesg = $ldap->search ( @args ) or die $!;
    > *while(my $entry = $mesg->shift_entry()){* ## Aqui no entra
    >         say "Entre en while";
    >             my $lastLogonTimestamp =
    > $entry->get_value('lastLogonTimestamp');
    >             $lastLogonTimestamp =
    &conviertefecha($lastLogonTimestamp);
    >             my $msdsuaccountctrl =
    > $entry->get_value('msds-user-account-control-computed');
    >             my $departmento = $entry->get_value('department');
    >             say REPORTE
    > "$lastLogonTimestamp,$msdsuaccountctrl,$departmento";
    >         }
    >         my ($resp) = $mesg->control(LDAP_CONTROL_PAGED) or last;
    >         $cookie = $resp->cookie or last;
    >         $page->cookie($cookie);
    >     }
    >     if ($cookie){
    >         $page->cookie($cookie);
    >         $page->size(0);
    >         $ldap->search( @args );
    >     }
    >     $ldap->unbind;
    > }
    > unless ( @ARGV eq '2' ){
    >     say "[SYNTAX ERROR]\n[INFO] ./$0 [fichero_configuracion]
    [dominio]";
    >     exit(1);
    > }
    > while(my $linea=<CONFIG>){
    >     chomp($linea);
    >     if($siguiente eq '1'){
    >         $passwd = $linea;
    > &busca($user,$passwd);
    >         exit(0);
    >     }
    >     $user = $linea;
    >     $siguiente = '1';
    > }
    >
    >
    > _______________________________________________
    > Madrid-pm mailing list
    > [email protected] <mailto:[email protected]>
    > http://mail.pm.org/mailman/listinfo/madrid-pm
    ------------ próxima parte ------------
    Se ha borrado un adjunto en formato HTML...
    URL:
    
<http://mail.pm.org/pipermail/madrid-pm/attachments/20110920/e77ad5fb/attachment.html>

    ------------------------------

    _______________________________________________
    Madrid-pm mailing list
    [email protected] <mailto:[email protected]>
    http://mail.pm.org/mailman/listinfo/madrid-pm

    Fin de Resumen de Madrid-pm, Vol 57, Envío 1
    ********************************************




_______________________________________________
Madrid-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/madrid-pm
_______________________________________________
Madrid-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/madrid-pm

Responder a