从1000增加限制?

时间:2011-04-29 10:25:20

标签: perl active-directory ldap

当我像这样进行搜索时

my $mesg = $ldap->search(
  base   => "OU=test,DC=example,DC=com",
  scope  => 'one',
  filter => '(objectClass=organizationalPerson)',
  attrs  => ['distinguishedName', 'displayName', 'sAMAccountName', 'employeeID'],
);

我只能获得1000个条目,我期望~20000。

是否可以在我的Perl脚本中增加此限制,还是必须在服务器上更改?

3 个答案:

答案 0 :(得分:10)

解决方案是使用像这样的分页搜索

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

my $page = Net::LDAP::Control::Paged->new(size => 999);
my $cookie;

while (1) {
    $mesg = $ldap->search(
    base    => "OU=test,DC=example,DC=com",
    scope   => 'one',
    filter  => '(objectClass=organizationalPerson)',
    attrs   => ['distinguishedName', 'displayName', 'sAMAccountName', 'employeeID'],
    control => [$page]
    );

    $mesg->code && die "Error on search: $@ : " . $mesg->error;
    while (my $adentry = $mesg->pop_entry()) {

    # process $adentry
    }

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

if ($cookie) {
    print "abnormal exit\n";
    # Abnormal exit, so let the server know we do not want any more
    $page->cookie($cookie);
    $page->size(0);
    $ldap->search(control => [$page]);
}

答案 1 :(得分:3)

默认情况下,AD将最大页面大小设置为1000.客户端将收到前1000个结果,并且还会收到错误“超出大小限制”。

为避免这种情况,客户端必须使用分页控件,如果使用分页控件,服务器将不会返回错误,而是发送cookie(一个字节)以指示可用的结果更多。如果没有可用的cookie,则意味着没有更多的结果。因此,您可以继续循环以获得结果,直到cookie为空。

如果需要,您还可以在服务器中修改MaxPageSize,启动ntdsutil和 输入以下内容,

ldap policies 
connections 
connect to server servername.domain.name 
q 
set maxpagesize to 5000 
commit 
changes 
q 
q

如果客户端不支持分页并且无法修改客户端,则主要完成此操作。

答案 2 :(得分:0)

您没有指定用于ldap搜索的模块。顺便说一下'sizelimit'键可用于它,但默认情况下它不受限制。这可以是服务器端限制配置。