Start · Sprachen · PHP · Referenz · ldap_delete

ldap_delete

Funktion

Löscht einen einzelnen Eintrag anhand seines Distinguished Name (DN) aus einem LDAP-Verzeichnis.

seit PHP 4.0.0 Kategorie: misc

Signatur

ldap_delete(LDAP\Connection $ldap, string $dn, ?array $controls = null): bool

Beschreibung

ldap_delete entfernt den durch den Parameter dn eindeutig identifizierten Eintrag aus dem verbundenen LDAP-Verzeichnis. Die Funktion führt einen LDAP-DELETE-Vorgang durch und gibt true zurück, wenn der Löschvorgang erfolgreich war.

Wichtig: LDAP-Einträge mit untergeordneten Einträgen (Child-Entries) können in der Regel nicht direkt gelöscht werden. Es müssen zunächst alle Kindelemente rekursiv entfernt werden, bevor der übergeordnete Knoten gelöscht werden kann. Manche LDAP-Server unterstützen ein Tree Delete Control (1.2.840.113556.1.4.805), das rekursives Löschen ermöglicht.

Die Funktion ist nützlich, wenn Benutzerkonten, Gruppen oder andere LDAP-Objekte aus einem Verzeichnisdienst wie OpenLDAP oder Active Directory entfernt werden sollen. Für den Löschvorgang muss die verwendete Verbindung mit einem Konto gebunden sein, das über ausreichende Schreibrechte verfügt.

Ab PHP 8.1.0 erwartet der erste Parameter ein LDAP\Connection-Objekt anstelle der früher verwendeten resource. Außerdem kann über den optionalen Parameter controls ein Array mit LDAP-Server-Controls übergeben werden, z. B. für das Tree-Delete-Control.

Parameter

Name Typ Default Beschreibung
$ldap Pflicht LDAP\Connection Eine aktive LDAP-Verbindung, die zuvor mit ldap_connect erstellt und mit ldap_bind authentifiziert wurde.
$dn Pflicht string Der vollständige Distinguished Name (DN) des zu löschenden Eintrags, z. B. uid=jdoe,ou=Users,dc=example,dc=com.
$controls array|null null Optionales Array mit LDAP-Server-Controls, die zusammen mit der Anfrage gesendet werden sollen. Wird seit PHP 7.3.0 unterstützt. Kann z. B. das Tree-Delete-Control enthalten, um ganze Teilbäume rekursiv zu löschen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Eintrag erfolgreich gelöscht wurde. Im Fehlerfall (z. B. fehlende Rechte, Eintrag existiert nicht, Eintrag hat Kindelemente) wird false zurückgegeben. Mit ldap_error oder ldap_errno kann der genaue Fehler abgefragt werden.

Beispiele

Einfaches Löschen eines LDAP-Eintrags

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

$bound = ldap_bind($ldap, 'cn=admin,dc=example,dc=com', 'geheimesPasswort');

if (!$bound) {
    die('Bindung fehlgeschlagen: ' . ldap_error($ldap));
}

$dn = 'uid=jdoe,ou=Users,dc=example,dc=com';

if (ldap_delete($ldap, $dn)) {
    echo "Eintrag '$dn' erfolgreich gelöscht.";
} else {
    echo 'Fehler beim Löschen: ' . ldap_error($ldap);
}

ldap_unbind($ldap);
?>
Eintrag 'uid=jdoe,ou=Users,dc=example,dc=com' erfolgreich gelöscht.

Rekursives Löschen eines Teilbaums mit Tree-Delete-Control

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

$dn = 'ou=TestAbteilung,dc=example,dc=com';

// Tree Delete Control OID: 1.2.840.113556.1.4.805
$controls = [
    [
        'oid'        => '1.2.840.113556.1.4.805',
        'iscritical' => true,
        'value'      => '',
    ]
];

if (ldap_delete($ldap, $dn, $controls)) {
    echo "Teilbaum '$dn' und alle Kindelemente erfolgreich gelöscht.";
} else {
    echo 'Fehler: ' . ldap_error($ldap);
}

ldap_unbind($ldap);
?>
Teilbaum 'ou=TestAbteilung,dc=example,dc=com' und alle Kindelemente erfolgreich gelöscht.

// Wichtig · Fallstricke

Rechte: Der gebundene Benutzer muss über ausreichende Schreibrechte (ACLs) im Verzeichnis verfügen, um Einträge löschen zu dürfen. Andernfalls schlägt die Operation mit einem Berechtigungsfehler fehl.

Kindelemente: Standardmäßig schlägt das Löschen fehl, wenn der Ziel-Eintrag untergeordnete Einträge besitzt (LDAP_NOT_ALLOWED_ON_NONLEAF). Entweder müssen Kindelemente vorher manuell rekursiv gelöscht werden, oder der LDAP-Server muss das Tree-Delete-Control (1.2.840.113556.1.4.805) unterstützen.

Sicherheit: DN-Werte, die aus Benutzereingaben stammen, müssen stets sorgfältig validiert und escapet werden (z. B. mit ldap_escape und dem Flag LDAP_ESCAPE_DN), um LDAP-Injection-Angriffe zu verhindern.

PHP 8.1: Der Ressource-Typ für LDAP-Verbindungen wurde durch das Objekt LDAP\Connection ersetzt. Code, der noch eine resource übergibt, erzeugt seit PHP 8.1 einen Deprecation-Hinweis.