Bei der Nutzung der PHP LDAP-Bibliothek kann es beim Aufruf von ldap_search() zu folgendem Fehler kommen:
Warning: ldap_search(): Search: Size limit exceeded
ldap_error: Size limit exceeded (4)
Ursache: Active Directory begrenzt LDAP-Suchanfragen standardmäßig auf 1000 Einträge pro Seite (MaxPageSize). Wer mehr Objekte abrufen will — z.B. alle User eines größeren AD — muss Paging nutzen.
Der saubere Weg: LDAP Paged Result Controls in PHP verwenden. Dabei wird seitenweise abgerufen und per Cookie durch die Ergebnisse navigiert.
<?php
$ldap = ldap_connect("ldap://your-dc.domain.local");
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($ldap, "cn=serviceuser,dc=domain,dc=local", "password");
$baseDn = "dc=domain,dc=local";
$filter = "(&(objectClass=user)(objectCategory=person))";
$pageSize = 500;
$cookie = "";
$allUsers = [];
do {
ldap_control_paged_result($ldap, $pageSize, true, $cookie);
$result = ldap_search($ldap, $baseDn, $filter, ["sAMAccountName", "mail", "displayName"]);
$entries = ldap_get_entries($ldap, $result);
for ($i = 0; $i < $entries["count"]; $i++) {
$allUsers[] = $entries[$i];
}
ldap_control_paged_result_response($ldap, $result, $cookie);
} while (!empty($cookie));
ldap_unbind($ldap);
echo "Gefundene User: " . count($allUsers) . PHP_EOL;
?>
⚠️ PHP 8.0+: ldap_control_paged_result() ist deprecated. Moderne Alternative mit dem $controls-Parameter:
$controls = [[
"oid" => LDAP_CONTROL_PAGEDRESULTS,
"iscritical" => false,
"value" => ["size" => 500, "cookie" => $cookie]
]];
$result = ldap_search($ldap, $baseDn, $filter, [], 0, 0, 0, LDAP_DEREF_NEVER, $controls);
ldap_parse_result($ldap, $result, $errcode, $matcheddn, $errmsg, $referrals, $retcontrols);
$cookie = $retcontrols[LDAP_CONTROL_PAGEDRESULTS]["value"]["cookie"] ?? "";
Alternativ lässt sich das AD-seitige Limit per ntdsutil anheben — das ist aber ein globaler Eingriff in die AD-Konfiguration und in den meisten Fällen der falsche Ansatz.
👉 Anleitung dazu: MaxPageSize in Active Directory mittels ntdsutil anpassen
H@ppy H@cking! 🐘⚡