Start · Sprachen · PHP · Referenz · ldap_list

ldap_list

Funktion

Führt eine LDAP-Suche mit dem Scope <code>LDAP_SCOPE_ONELEVEL</code> durch, d. h. nur direkte Kindelemente des angegebenen Basis-DNs werden durchsucht.

seit PHP 4.0.0 Kategorie: misc

Signatur

ldap_list(LDAP\Connection|array $ldap, array|string $base, array|string $filter, array $attributes = [], int $attributes_only = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, ?array $controls = null): LDAP\Result|array|false

Beschreibung

ldap_list durchsucht genau eine Ebene unterhalb des angegebenen Basis-DN (Base Distinguished Name). Im Gegensatz zu ldap_search (rekursive Suche über den gesamten Teilbaum) oder ldap_read (nur das Basisobjekt selbst) liefert ldap_list ausschließlich direkte Kinder des Basis-Eintrags – vergleichbar mit einem einfachen ls in einem Verzeichnis.

Diese Funktion ist besonders nützlich, wenn die Struktur des Verzeichnisses bekannt ist und man gezielt alle Einträge einer Organisationseinheit (OU) auflisten möchte, ohne tiefer verschachtelte Unterstrukturen zu durchsuchen. Das reduziert den Datenverkehr und die Serverlast erheblich.

Der Rückgabewert ist eine LDAP\Result-Ressource (seit PHP 8.1 ein Objekt), die mit Funktionen wie ldap_get_entries, ldap_first_entry oder ldap_count_entries weiterverarbeitet werden kann. Wird ein Array von LDAP-Verbindungen und/oder Basis-DNs übergeben, gibt die Funktion ein Array von Ergebnis-Ressourcen zurück.

Über die optionalen Parameter lassen sich die Ergebnismenge ($sizelimit), das Zeitlimit ($timelimit), die zurückgegebenen Attribute ($attributes) sowie das Dereferenzierungsverhalten ($deref) feingranular steuern. LDAP-Controls (z. B. für Paginierung) können seit PHP 7.3 über $controls übergeben werden.

Parameter

Name Typ Default Beschreibung
$ldap Pflicht LDAP\Connection|array Eine gültige LDAP-Verbindungsressource (seit PHP 8.1 ein LDAP\Connection-Objekt), die mit ldap_connect erzeugt und mit ldap_bind authentifiziert wurde. Alternativ ein Array von Verbindungen für parallele Suchen.
$base Pflicht array|string Der Basis-DN, unterhalb dessen gesucht wird, z. B. 'ou=Users,dc=example,dc=com'. Bei mehreren Verbindungen kann hier ein Array von Basis-DNs übergeben werden.
$filter Pflicht array|string LDAP-Suchfilter gemäß RFC 4515, z. B. '(objectClass=inetOrgPerson)'. Schränkt die zurückgegebenen Einträge auf passende Objekte ein.
$attributes array [] Liste der zurückzugebenden Attribute, z. B. ['cn', 'mail', 'uid']. Ein leeres Array liefert alle Attribute des Eintrags zurück.
$attributes_only int 0 Wenn auf 1 gesetzt, werden nur Attributnamen ohne deren Werte zurückgegeben. Nützlich, um die vorhandene Schema-Struktur zu ermitteln.
$sizelimit int -1 Maximale Anzahl zurückzugebender Einträge. -1 bedeutet, dass das serverseitig konfigurierte Limit gilt. Ein clientseitiges Limit überschreibt nie das Serverlimit nach oben.
$timelimit int -1 Maximale Wartezeit in Sekunden. -1 verwendet das serverseitige Standard-Timeout. Auch hier gilt: Das Serverlimit kann nicht clientseitig überschritten werden.
$deref int LDAP_DEREF_NEVER Legt fest, wie Aliasse behandelt werden. Mögliche Werte: LDAP_DEREF_NEVER, LDAP_DEREF_SEARCHING, LDAP_DEREF_FINDING, LDAP_DEREF_ALWAYS.
$controls array|null null Array von LDAP-Controls, die mit der Anfrage gesendet werden sollen (z. B. Server-Side Sorting oder Paginierung). Seit PHP 7.3 verfügbar.

Rückgabewert

Typ
LDAP\Result|array|false
Beschreibung
Bei Erfolg eine LDAP\Result-Instanz (vor PHP 8.1 eine Ressource), die mit ldap_get_entries o. ä. ausgewertet werden kann. Bei Übergabe von Arrays von Verbindungen wird ein Array von Ergebnisobjekten zurückgegeben. Im Fehlerfall wird false zurückgegeben.

Beispiele

Alle Benutzer einer OU auflisten

<?php
$conn = ldap_connect('ldap://ldap.example.com');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);

if (!ldap_bind($conn, 'cn=admin,dc=example,dc=com', 'geheim')) {
    die('Bind fehlgeschlagen');
}

$base   = 'ou=Users,dc=example,dc=com';
$filter = '(objectClass=inetOrgPerson)';
$attrs  = ['cn', 'mail'];

$result = ldap_list($conn, $base, $filter, $attrs);

if ($result === false) {
    die('Suche fehlgeschlagen: ' . ldap_error($conn));
}

$entries = ldap_get_entries($conn, $result);
echo 'Gefundene Einträge: ' . $entries['count'] . PHP_EOL;

for ($i = 0; $i < $entries['count']; $i++) {
    $cn   = $entries[$i]['cn'][0] ?? 'n/a';
    $mail = $entries[$i]['mail'][0] ?? 'n/a';
    echo "Name: $cn, E-Mail: $mail" . PHP_EOL;
}

ldap_unbind($conn);
Gefundene Einträge: 3 Name: Max Mustermann, E-Mail: max@example.com Name: Erika Musterfrau, E-Mail: erika@example.com Name: Hans Beispiel, E-Mail: hans@example.com

Suche mit Größenlimit und Fehlerbehandlung

<?php
$conn = ldap_connect('ldap://ldap.example.com');
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($conn, 'cn=readonly,dc=example,dc=com', 'readonly123');

$base      = 'ou=Groups,dc=example,dc=com';
$filter    = '(objectClass=groupOfNames)';
$attrs     = ['cn', 'member'];
$sizelimit = 10; // Maximal 10 Gruppen zurückgeben

$result = ldap_list($conn, $base, $filter, $attrs, 0, $sizelimit);

if ($result === false) {
    echo 'Fehler: ' . ldap_error($conn) . PHP_EOL;
} else {
    $anzahl = ldap_count_entries($conn, $result);
    echo "Gefundene Gruppen (max. $sizelimit): $anzahl" . PHP_EOL;

    $entry = ldap_first_entry($conn, $result);
    while ($entry !== false) {
        $attrs_entry = ldap_get_attributes($conn, $entry);
        echo 'Gruppe: ' . ($attrs_entry['cn'][0] ?? 'unbekannt') . PHP_EOL;
        $entry = ldap_next_entry($conn, $entry);
    }
}

ldap_unbind($conn);
Gefundene Gruppen (max. 10): 4 Gruppe: Admins Gruppe: Entwickler Gruppe: Marketing Gruppe: Support

// Wichtig · Fallstricke

Scope-Unterschied: ldap_list verwendet intern den Scope LDAP_SCOPE_ONELEVEL. Tiefere Unterknoten werden nicht durchsucht. Für eine rekursive Suche ist ldap_search zu verwenden, für die Abfrage eines einzelnen Objekts ldap_read.

Sicherheit: Nutzereingaben, die in den $filter-Parameter einfließen, müssen mit ldap_escape($input, '', LDAP_ESCAPE_FILTER) escaped werden, um LDAP-Injection-Angriffe zu verhindern.

Sizelimit: Das clientseitige $sizelimit kann das serverseitige Limit niemals erhöhen. Werden mehr Einträge angefordert als der Server zulässt, liefert ldap_errno den Fehlercode 4 (LDAP_SIZELIMIT_EXCEEDED). Paginierung über Server-Controls ist der empfohlene Weg für große Ergebnismengen.

PHP 8.1+: Verbindungs- und Ergebnis-Ressourcen wurden zu echten Objekten (LDAP\Connection und LDAP\Result) aufgewertet. Alter Code mit is_resource()-Prüfungen muss ggf. angepasst werden.