Active Directory ermöglicht es, Gruppen zu verschachteln. So kann ein Benutzer Mitglied in Gruppe A sein, die selbst Mitglied von Gruppe B ist. Effektiv hat der Benutzer dann beide Gruppenmitgliedschaften, auch wenn er nur einer der Gruppen direkt angehört. Problematisch kann es sein, solche Verschachtelungen nachzuvollziehen – die Mitgliederliste von Gruppe B würde hier nur Gruppe A anzeigen, aber nicht den Benutzer. Ebenso würde man beim Benutzer nur die Mitgliedschaft in Gruppe A sehen, aber nicht die in Gruppe B.
Der Verzeichnisdienst verfügt über effiziente Methoden, solche Verschachtelungen aufzulösen, um die effektiven Mitgliedschaften herauszufinden. Wenig bekannt ist, dass man diese Methoden über einen LDAP-Filter direkt nutzen kann, ohne dass man selbst aufwändige rekursive Abfragen aufbauen muss. Einzig die Syntax solcher Abfragen ist etwas eigen.
LDAP-Filter arbeiten mit Vergleichsoperatoren. So lässt sich mit dem Filterausdruck (givenName=Nils) auf den Wert “Nils” im Feld für den Vornamen filtern. Mithilfe spezieller Operatoren lassen sich besondere Vergleiche anstellen, so gibt es etwa zwei Operatoren für bitweise AND- und OR-Vergleiche, mit denen sich die Werte einzelner Bits bei bestimmten Feldern prüfen lassen (beispielsweise userAccountControl, das verschiedene Zustände über Bits speichert). Seit Windows Server 2003 kennt Active Directory einen dritten Operator namens LDAP_MATCHING_RULE_IN_CHAIN.
Diese Spezialoperatoren hängt man über ihre Object ID an das Attribut an, das man prüfen will. Das sieht so aus:
(attribut:1.2.840.113556.1.4.1941:=Suchwert)
Schauen wir uns das an einem Beispiel an. Der EInfachheit halber nehmen wir zum Suchen hier das Programm Active Directory-Benutzer und -Computer, das auch LDAP-Suchstrings zulässt. Dazu wählt man im Dropdown des Suchdialogs “Benutzerdefinierte Suche” aus und wechselt dann auf die Registerkarte “Erweitert”.
Unser erstes Beispiel fragt nach allen Gruppen, in denen der Benutzer Nils direkt Mitglied ist. Der zugehörige Suchstring lautet:
(member=CN=Nils,OU=Gruppen,DC=domain,DC=tld)
Hier also noch keine Abfrage der Verschachtelungen. Das Ergebnis:
Wichtig hier: Es werden 32 Objekte gefunden, also 32 Gruppen, in denen Nils direkt Mitglied ist.
Das zweite Beispiel nutzt nun den Spezialoperator, um auch die indirekten Mitgliedschaften zu finden. Der Operator sorgt dafür, dass der Verzeichnisdienst für alle Objekte die Hierarchiekette im angegebenen Attribut nach “oben” durchläuft, also auch die “Eltern-Objekte” ausfindig macht.
(member:1.2.840.113556.1.4.1941:=CN=Nils,OU=Gruppen,DC=domain,DC=tld)
Hier gibt Active Directory 57 Objekte zurück – es gibt also 25 Gruppen, in denen Nils per Verschachtelung ein indirektes Mitglied ist.
Achtung aber: Dieses Beispiel ist sehr simpel, es fragt alle Gruppentypen ab und durchläuft die Rekursion. Will man auf diesem Weg herausfinden, über welche Gruppen ein Benutzer Berechtigungen erhält, so muss man den Filter erweitern. In diesem zweiten Beispiel sind nämlich auch alle Verteilergruppen enthalten, die keine Berechtigungen bekommen können. Um nur Sicherheitsgruppen als Ergebnis anzufordern, erweitert man den Filter folgendermaßen:
(&(member:1.2.840.113556.1.4.1941:=CN=Nils,OU=Gruppen,DC=domain,DC=tld)(groupType:1.2.840.113556.1.4.803:=2147483648))
Dieser Suchstring fügt ein zweites Kriterium an und filtert den Gruppentyp auf Sicherheitsgruppen. Dazu verwendet er ebenfalls einen Spezialoperator, und zwar den für das bitweise AND.
http://faq-o-matic.net/?p=7924