2012-09-06 19 views
1

根据我读过的所有文档,查询Ac​​tive Directory时结果集的最大大小为1000条记录。如果你需要超过1000个,你会被告知使用Net :: LDAP :: Control :: Paged来遍历并获得超过1000条记录,这是我试图做的。出于某种原因,尽管使用了分页控件,但我仍然只获得1000条记录。我使用的是与其他人声称使用相同的代码而没有任何运气。我在这里错过了什么吗?请注意,我没有对AD服务器的管理访问权限,因此更改配置不适合我。我粘贴了下面的相关代码,以便您可以指出我可能做错的任何事情。SizeLimit超出使用Net :: LDAP :: Control :: Paged

#!perl -w 

use strict; 
use Net::LDAP; 
use Net::LDAP::Control::Paged; 
use Net::LDAP::Constant qw(LDAP_CONTROL_PAGED); 

my $LDAPServer  = "<LDAP SERVER ADDRESS>"; 
my $base  = "<BASE DN>"; 
my $user    = "<LDAP USER>"; 
my $pass    = "<PASSWORD>"; 
my $page    = Net::LDAP::Control::Paged->new(size => 1000) or die $!; 
my $errorConnectionStr = ""; 
my $ldap; 
my $mesg; 
my $cookie; 

$ldap = Net::LDAP->new($LDAPServer); 
$mesg = $ldap->bind($user, password => $pass, version => 3); 

open(OUT,">users.csv"); 
print OUT "sAMAccountName,sn,givenName\n"; 

my $filter = "(&(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(!(objectClass=computer)))"; 
my @attribs = ("sn", "givenName", "sAMAccountName", "distinguishedName"); 

my @args = (
     base => $base, 
     scope => 'sub', 
     filter => $filter, 
     attrs => @attribs, 
     pagesize => 1000, 
     control => [$page] 
); 

while(1) { 
    $mesg = $ldap->search(@args) or die $!; 

    while (my $entry = $mesg->pop_entry()) { 
     my $print = 1; 

     my $dn = $entry->dn(); 
     my $uid = $entry->get_value('sAMAccountName'); 
     my $ln = $entry->get_value('sn'); 
     my $fn = $entry->get_value('givenName'); 

     if($dn =~ m/.*Resources.*/) { 
      $print = 0; 
     } 

     if(defined($uid) && defined($ln) && defined($fn)) { 
      if($print == 1) { 
       print OUT "$uid,$ln,$fn\n"; 
      } 
     } 
    } 

    my ($resp) = $mesg->control(LDAP_CONTROL_PAGED) or last; 
    $cookie = $resp->cookie or last; 
    $page->cookie($cookie); 
} 

if($cookie) { 
    print "Abnormal exit\n"; 
    $page->cookie($cookie); 
    $page->size(0); 
    $ldap->search(@args); 
} 

close(OUT); 
$ldap->unbind; 
+0

我相信这已经回答[这里](http://stackoverflow.com/questions/5830860/increase-limit-from-1000)。 – sferencik

+0

@sferencik不,我在示例中使用的代码是使用LDAP :: Control :: Paged作为您链接的页面在其答案中解释的。您链接的问题是询问如何返回超过1000条记录,并且提供的答案是使用与我试图使用的相同的控件不起作用。 –

回答

0

您需要attrs => \@attrs,@args。没有反斜杠,你插入奇数个元素('attrs'加上数组的四个元素),搜索方法没有看到pagesize参数。

0

我刚刚第一次使用它,它在这里工作。我的搜索很简单(显示容器中的所有对象)。我通过在800组页面中抓取他们列出了11.5万个群组。我的代码与您的代码几乎完全相同(它是Net :: LDAP :: Control :: Paged手册页上的示例和您的代码的混合),但我没有在搜索中指定页面大小:

while (1) { 
    my $mesg = $x->{ldap}->search(base => $x->{config}->{gbase}, 
           scope => 'sub', 
           control => [$page], 
           filter => 'cn=*', 
           attrs => \@attrs, 
    ); 
    die "LDAP error: server says ",$mesg->error,"\n" if $mesg->code; 

    foreach my $entry ($mesg->entries) { 
     my $cn = $entry->get_value('cn'); 
     my $desc = $entry->get_value('description'); 
     print "$cn - $desc\n"; 
    } 

    # Get cookie from paged control 
    my($resp) = $mesg->control(LDAP_CONTROL_PAGED) or last; 
    $cookie = $resp->cookie or last; 

    # Set cookie in paged control 
    $page->cookie($cookie); 
}