jinyedge's note
{http://www.jinyedge.pe.kr}


Hi, this is jinyedge. I'm a software developer. I hope you can find some useful information in my homepage.


jinyedge at gmail.com
Since 2001.12.05

 

 
Subj Cont
 
Subj: Perl, Retrieving users from Active Directory using LDAP::Contrl::Paged.
Mtime: 2010-03-26 00:33:31

#!/usr/bin/perl
#########################################################
# Retrieving users from Active Directory.
#
# @author jinyedge
#########################################################
use strict;
use Net::LDAP;
use Net::LDAP::Control::Paged;
use Net::LDAP::Constant qw(LDAP_CONTROL_PAGED);

#------------------------------------------------------
sub get_ldap_pages{
    my $ldap = shift;
    my $base = shift;
    my $attrs = shift;
    my $filter = shift;

    my $control = Net::LDAP::Control::Paged->new(size => 1000);

    my @args = (
        base => $base
        , scope => "sub"
        , attrs => $attrs
        , filter => $filter
        , control => [$control]
    );

    my $cookie;
    my $rset;
    my @pages;
    while($rset = $ldap->search(@args)) {
        # fatal on search error
        if($rset->code){
            @pages = ();
            last;
        }

        push @pages, $rset->as_struct;

        # handle next search page
        my($resp) = $rset->control(LDAP_CONTROL_PAGED);
        $cookie = $resp->cookie or last;
        $control->cookie($cookie);
    }

    # be nice to the server and stop the search if we still have a cookie
    if($cookie){
        $control->cookie($cookie);
        $control->size(0);
        $ldap->search(@args);
    }

    return \@pages;
}

#------------------------------------------------------
sub ldap_page{
    my $ldap = Net::LDAP->new("192.168.0.5") or die $@;
    my $resp = $ldap->bind("administrator\@rainbowx.net", password => "7842", version => 3);
    die "error binding to ad ldap: ", $resp->error if ($resp->code);

    my $pages = get_ldap_pages(
        $ldap
        , "dc=rainbowx,dc=net"
        , ["samaccountname", "primarygroupid", "memberof"]
        , "(&(objectclass=user)(!(objectclass=computer)))"
    );
    
    for my $href(@$pages){
        while(my($k, $v) = each(%$href)){
            my $un = $v->{"samaccountname"}->[0];
            print "$un\n";
        }
    }

    $ldap->unbind;
}

#------------------------------------------------------
# Main.

ldap_page();