Wie schreibe ich eine LDAP-Abfrage, um zu testen, ob der Benutzer Mitglied einer Gruppe ist?

129

Ich möchte eine LDAP-Abfrage schreiben, die testet, ob ein Benutzer (sAMAccountName) Mitglied einer bestimmten Gruppe ist. Ist das möglich, damit ich entweder 0 oder 1 Ergebnisdatensätze bekomme?

Ich denke, ich kann alle Gruppen für den Benutzer abrufen und jede für eine Übereinstimmung testen, aber ich habe mich gefragt, ob ich sie in einen LDAP-Ausdruck packen könnte.

Irgendwelche Ideen?

Vielen Dank

paul
quelle
Siehe auch Fragen wie Rekursive Abfrage der LDAP-Gruppenmitgliedschaft
Franklin Piat

Antworten:

177

Mit diesem Filter sollten Sie hier eine Abfrage erstellen können:

(&(objectClass=user)(sAMAccountName=yourUserName)
  (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))

Wenn Sie dies auf Ihrem LDAP-Server ausführen und ein Ergebnis erhalten, ist Ihr Benutzer "yourUserName" tatsächlich Mitglied der Gruppe "CN = YourGroup, OU = Users, DC = YourDomain, DC = com

Versuchen Sie zu sehen, ob dies funktioniert!

Wenn Sie C # / VB.Net und System.DirectoryServices verwenden, sollte dieses Snippet den folgenden Trick ausführen:

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com");

DirectorySearcher srch = new DirectorySearcher(rootEntry);
srch.SearchScope = SearchScope.Subtree;

srch.Filter = "(&(objectClass=user)(sAMAccountName=yourusername)(memberOf=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))";

SearchResultCollection res = srch.FindAll();

if(res == null || res.Count <= 0) {
    Console.WriteLine("This user is *NOT* member of that group");
} else {
    Console.WriteLine("This user is INDEED a member of that group");
}

Achtung: Dies wird nur auf unmittelbare Gruppenmitgliedschaften getestet und nicht auf Mitgliedschaft in der sogenannten "primären Gruppe" (normalerweise "cn = Benutzer") in Ihrer Domain. Verschachtelte Mitgliedschaften werden nicht behandelt, z. B. Benutzer A ist Mitglied der Gruppe A, die Mitglied der Gruppe B ist. Die Tatsache, dass Benutzer A auch wirklich Mitglied der Gruppe B ist, wird hier nicht berücksichtigt.

Marc

marc_s
quelle
1
Versucht, aber immer noch nicht für mich arbeiten. Sollte es in der memberOf-Klausel 'OU = Users' oder 'OU = Groups' sein?
Paul
3
Dies ist meine Abfrage: (& (objectClass = person) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Gruppen, OU = MYTOWN, OU = Deutschland, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) Der DN ist wirklich so lang. Ich bin damit einverstanden , dass es sollte funktionieren. Danke fürs Helfen!
Paul
3
Aus einer Laune heraus habe ich die einfachen Anführungszeichen nach memberof entfernt und erhalte jetzt ein Ergebnis! Danke
Paul
2
Gute Antwort. Es sollte jedoch darauf hingewiesen werden, dass dies nur auf LDAP-Servern funktioniert, die ein 'memberOf'-Attribut verwalten. Die allgemeinere Technik besteht darin, das Gruppenobjekt abzurufen und seine Attribute uniqueMember, roleOccupant usw. für den DN des Benutzers zu untersuchen, je nachdem, welches Schema das Gruppenobjekt verwendet.
Marquis von Lorne
1
@ Gunslinger LDAP-Attributnamen und -werte unterscheiden nicht zwischen Groß- und Kleinschreibung und DNs auch nicht, aber AD hat seine eigenen Regeln ...
Marquis of Lorne
35

Wenn Sie OpenLDAP (dh slapd) verwenden, das auf Linux-Servern üblich ist, müssen Sie das Mitglied der Überlagerung aktivieren, damit es mit dem Attribut (memberOf = XXX) mit einem Filter übereinstimmen kann.

Sobald Sie das Overlay aktiviert haben, werden die memberOf-Attribute für vorhandene Gruppen nicht aktualisiert (Sie müssen die vorhandenen Gruppen löschen und wieder hinzufügen). Wenn Sie das Overlay zu Beginn aktiviert haben und die Datenbank leer war, sollten Sie in Ordnung sein.

Telford Tendys
quelle
8
Ein Link zu einer Seite, auf der erklärt wird, wie das Overlay-Mitglied aktiviert wird, wäre vermutlich hilfreich.
Gokhan Sari
5
Tutorial, das für mich funktioniert hat: schenkels.nl/2013/03/… @Telford Tendrys, Alter, du hast mir mit diesem Hinweis über bereits bestehende Gruppen das Leben gerettet. Danke vielmals!
ŁukaszBachman
21

Ich würde noch etwas zu Marc's Antwort hinzufügen: Das memberOf-Attribut darf keine Platzhalter enthalten, daher können Sie nicht so etwas wie "memberof = CN = SPS *" sagen und erwarten, dass alle Gruppen gefunden werden, die mit "SPS" beginnen.

Bill Brinkley
quelle
Danke für diese Information. Ich habe versucht zu tun, was Sie sagen, kann nicht getan werden. Wie kann ich das mit PHP machen? Ist es möglich, dasselbe Ergebnis auf andere Weise zu erzielen? Um alle Gruppen zu finden, beginne mit SPS und was auch immer ... Ich kann immer alles greifen und mein Array schleifen und dann mit dem gewünschten CN übereinstimmen, aber ich bevorzuge es, wenn möglich, direkt danach zu suchen.
ODelibalta
15

Sie müssen Ihre Abfragebasis auf den DN des betreffenden Benutzers und dann Ihren Filter auf den DN der Gruppe setzen, bei der Sie sich fragen, ob sie Mitglied sind. Um zu sehen, ob jdoe Mitglied der Bürogruppe ist, sieht Ihre Anfrage ungefähr so ​​aus:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host '(memberof=cn=officegroup,dc=example,dc=local)'

Wenn Sie ALLE Gruppen sehen möchten, in denen er Mitglied ist, fordern Sie bei Ihrer Suche einfach nur das Attribut 'memberof' an:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
gpayne_007
quelle