Simple Paged Results with Net::LDAP

March 13, 2007 by: Phil Lembo

Not sure if I’ve posted on this before, but I wanted to capture it now. Useful for doing big searches against an Active Directory (default restriction on search results returned is 200). Using Net::LDAP.

#!/usr/bin/perl
use Net::LDAP;
use Net::LDAP::Entry;
use Net::LDAP::Control::Paged;
use Net::LDAP::Constant qw( LDAP_CONTROL_PAGED );

my $adHost = "detroit.domain.com"
my $adUsr = "cn=ldapadmin,cn=users,dc=company,dc=domain,dc=com";
my $adPass = "1234xyz";
my $base = "cn=users,dc=company,dc=domain,dc=com";
my $query = "(mail=*)";
my @attrs = qw(cn displayname mail);

my $ldap = Net::LDAP->new($adHost) or die $!;
my $mesg = $ldap->bind($adUsr, password =>$adPass);

my $page = Net::LDAP::Control::Paged->new( size => 1000 ) or die $!;
my @args = ( base => $base,
             scope => 'sub',
             filter => $query,
             attrs => \@attrs,
             control => [ $page ],
           );

my $cookie;

while (1) {
     $mesg = $ldap->search ( @args ) or die $!;
     while (my $entry = $mesg->shift_entry()) {
         my $entrydn = $entry->dn();
         my $mail = $entry->get_value('mail');
         my $displayname = $entry->get_value('displayname');
         my $cn = $entry->get_value('cn');
         print "\"$displayname\",\"$mail\"\n";
     } 

  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;

Comments are closed.