2012-09-06 18 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); 
}