[Madrid-pm] consulta masiva a directorio activo

deibyz deibyz en gmail.com
Mar Sep 20 09:10:15 PDT 2011


Yo te recomendaría que no usarás líneas tal que:

my $mesg = $ldap->bind($us, password =>$pass);

Sin comprobar luego si en $mesg tienes un OK o un Uruk-Hai, que nunca se
sabe :-P

$mesg es un Net::LDAP::Message, puedes mirar en la docu como comprobar si te
ha devuelto algún código de error o algo parecido después del bind, que para
mí sería de los principales sospechos. Todo esto además de strict y
similares que ya recomiendan por ahí.

Saludos,
D.



2011/9/20 Jorge Gonzalez <jorge.gonzalez en daikon.es>

>  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 [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 listMadrid-pm en pm.orghttp://mail.pm.org/mailman/listinfo/madrid-pm
>
>
> _______________________________________________
> Madrid-pm mailing list
> Madrid-pm en pm.org
> 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/06ae292f/attachment.html>


Más información sobre la lista de distribución Madrid-pm