当我像这样进行搜索时
my $mesg = $ldap->search(
base => "OU=test,DC=example,DC=com",
scope => 'one',
filter => '(objectClass=organizationalPerson)',
attrs => ['distinguishedName', 'displayName', 'sAMAccountName', 'employeeID'],
);
我只能获得1000个条目,我期望~20000。
是否可以在我的Perl脚本中增加此限制,还是必须在服务器上更改?
答案 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'键可用于它,但默认情况下它不受限制。这可以是服务器端限制配置。