Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi [Erledigt] JwSCL AccessCheck löst Gruppen nicht auf (https://www.delphipraxis.net/186186-%5Berledigt%5D-jwscl-accesscheck-loest-gruppen-nicht-auf.html)

berens 11. Aug 2015 14:07


[Erledigt] JwSCL AccessCheck löst Gruppen nicht auf
 
Zitat:

TL;DR
-Nimmt man einen Benutzer in eine Gruppe auf, muss Dieser sich erst neu anmelden, damit die Änderungen wirksam werden
-Der Benutzer ist laut AccessCheck NICHT Mitglied aller generischen Administrator-Gruppen (Domänen-Admins etc.), wenn das Programm nicht mit rechter Maustaste --> Als Administrator ausführen gestartet wurde.
Hallo!

Bezugnehmend auf http://www.delphipraxis.net/186129-m...ststellen.html und http://www.delphipraxis.net/184812-w...verwenden.html bin ich immernoch dabei zu prüfen, ob der aktuell angemeldete Benutzer (also der Context, in dem mein Programm läuft) die Berechtigung für etwas hat: Wenn eine Gruppe die Berechtigung hat, in welcher der Benutzer Mitglied ist, oder eine Gruppe, welche die zuerstgenannte Gruppe enthält usw. (Verschachtelung, Vererbung(?).

Zwischenfrage: Reden wir überhaupt von Vererbung, wenn ein Benutzer Mitglied in einer Gruppe ist, bzw. eine Gruppe Mitglied in einer Gruppe? Oder hab dies garnichts mit Vererbung zu tun? (Bei Dateien und Ordnern heißt vererben ja dass sich die Rechte auf die Unterordner auswirken, Gruppenberechtigungen wirken sich ja dort IMMER auf die enthaltetenen Gruppen und Benutzer aus...)


Ich bin nun soweit, dass ich meinen TJwSecurityDescriptor habe, in dem die Rechte etc. nun korrekt gespeichert sind. Mit
Delphi-Quellcode:
  CheckBox1.Checked := TJwSecureGeneralObject.AccessCheck(mySecurityDescriptor, NIL, 1, TMySampleMapping);
  CheckBox2.Checked := TJwSecureGeneralObject.AccessCheck(mySecurityDescriptor, NIL, 2, TMySampleMapping);
kann ich nun sogar -korrekt- prüfen, ob der aktuelle Benutzer etwas darf (hier: Ob das "Recht" bzw. Bit 1 bzw. 2 in dem SecurityDescriptor gesetzt ist). Wenn ich -auf meinem lokalen PC ohne Domäne- eine Gruppe berechtige, wirkt sich das Recht korrekt auf meinen Account aus, der Mitglied in dieser Gruppe ist, auch wenn mein Account nicht explizit im SecurityDescriptor erwähnt ist. Soweit alles super.

Wenn ich das Ganze nun in einer Domäne teste und dort eine Gruppe berechtige, in der mein aktuell angemeldeter Domänenbenutzer Mitglied ist, funktioniert das aber nicht und ich erhalte immer "False" zurück.

Scheinbar wird also nicht nachgeschaut, ob der aktuelle Benutzer Mitglied in dieser Gruppe ist. Wie kann man das korrigieren?

Edit:
1) Ich verwende für Clienttoken NIL, weil ich davon ausgehe, dass AccessCheck dann einfach meinen aktuellen Benutzeraccount nimmt. Spricht was dagegen?
2) Ich verwende MapGenericMask nicht, was in diesem Beispiel verwendet wird: http://www.delphipraxis.net/837437-post14.html , da ich einfach bei DesiredAccess nur das "Bit" übergebe, dessen Zugriff ich brauche (PowerOf2, also 1-2-4-8-16-...). Kombinationen wäre später auch möglich (z.B. bei "15" (Binär: "1111") müssten die ersten vier Bits/ACEs "Erlauben" sein). Ich denke mal, MapGenericMask brauch man nur, wenn bestimmte Bedingungen eingehalten werden müssen (z.B. bei Dateien erfordert "Schreiben" unbedingt auch das Recht "Lesen"), und deshalb kann ich es weglassen, oder?

berens 12. Aug 2015 09:13

[Erledigt] JwSCL AccessCheck löst Gruppen nicht auf
 
Ok, Problem gelöst, ich weiß nicht recht, ob ich mich wegen der Ursache des Problems ärgern, oder wegen der einfachen Lösung freuen soll. Um mein Programm zu testen, habe ich es jedes mal in meine Testdomäne übertragen und dort immer und immer wieder getestet. Was hier nicht erwähnt wurde, ist das ich die Domänen-Gruppen in der laufenden Sitzung erstellt habe, und meinen Benutzer auch dann "erst" in die Gruppen hinzugefügt habe.

Mal wieder ist mehr Hintergrundwissen echt von Vorteil:
Dank http://blog.dikmenoglu.de/2009/11/al...s-exportieren/ weiß ich nun dass der Benutzer erst nach einer erneuten Anmeldung an der Domäne tatsächlich in die entsprechenden Gruppen aufgenommen wird. Das muss man erst mal wissen!

Zitat:

-Hat sich der Benutzer nach dem hinzufügen zur Gruppen erneut an seinem Client angemeldet? Denn Gruppenmitgliedschaften werden nicht während einer Benutzersitzung ausgewertet, sondern nur bei der Anmeldung.

-Hat sich der Benutzer bereits neu angemeldet, kann mit Whoami /all das Access-Token ausgewertet werden. Damit kann man überprüfen, ob sich der Benutzer auch tatsächlich in der entsprechenden Gruppe befindet.
Den "whoami /all" Befehl kann ich Euch nur wärmstens empfehlen, er zeigt ALLE Gruppen an, in der man direkt oder auch indirekt (durch 1000fache Verschachtelung) Mitglied ist. Da man die Kommandozeilenausgabe auch in eine Datei umleiten kann, lässt sich diese besser lesen und durchsuchen. Man nehme hier "whoami /all > x:\1.txt" um z.B. auf Laufwerk X: eine Textdatei mit dem Namen 1.txt zu erstellen... (oh, steht ja auch oben auf der Seite beschrieben... :stupid:)

Und jetzt kommt nochmal der besondere Clou:
Die UAC beeinflusst die Ergebnisse der Abfrage [der Gruppenmitgliedschaft] mit dem AccessCheck. Mein Benutzer ist Mitglied von "Domänen-Admins". "Domänen-Admins" hat in meiner Demo ein bestimmtest Recht. Wenn ich das Programm nun normal starte habe "ich" dieses Recht aber nicht. .exe-Datei nochmal mit rechte Maustaste "Als Administrator ausführen" gestartet --> Recht vorhanden, Alles in Ordnung.

Dank an alle Leser, ich hoffe, meien Antwort konnte Euch auch helfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz