N'Abend!
Ich bräuchte da mal etwas Hilfe... (Disclaimer: Das ist mein allererster Ausflug ins Thema Security)
Die Aufgabenstellung ist, zu prüfen, ob der aktuelle Benutzer (d.h. der, der mein Programm, bzw. meine
DLL, ausführt) ein bestimmtes
"Extended Right" im Active Directory hat. Dabei ist vor allem auch wichtig, dass indirekt erteilte (oder verweigerte) Berechtigungen über Gruppenmitgliedschaften ebenfalls ausgewertet werden, mit anderen Worten, es geht um die "effektiven Berechtigungen".
Ich habe mittlerweile bereits zwei Fragen zum Thema auf StackOverflow gestellt:
Auch wenn ich in den Antworten und Kommentaren bereits einige nützliche Hinweise bekommen habe, bin ich (gefühlt) immer noch meilenweit entfernt vom Erreichen meines Ziels. Also dachte ich, ich frag' mal jemanden, der sich damit auskennt (ich weiß, Schande über mich, dass ich nicht zuerst hier gefragt habe)...
Leider bin ich noch nicht wirklich an einem Punkt, wo ich die Grundlagen gut genug verstehe, um einfach kurze und knackige Fragen zu stellen, deswegen hier ein Überblick über das, was ich bisher schon erreicht bzw. ausprobiert habe:
- Ich kann, mit Hilfe von ADsGetObject und IADs.Get den IADsSecurityDescriptor meines Zielobjektes, sowie die darin enthaltene DACL, auslesen - damit kann ich direkt zugewiesene Extended Rights bereits zuverlässig prüfen - es fehlt aber die Auswertung der Gruppenmitgliedschaften (das könnte ich natürlich auch zu Fuß machen, aber ich bin mir ziemlich sicher, dass es dafür bereits eine fertige Lösung geben muss)
- Ich habe angefangen, das MSDN-Beispiel zur API AccessCheckByTypeResultList nach Delphi zu übertragen, tue mich dabei aber noch sehr schwer:
- Wo bekomme ich den ClientToken her, den ich da übergeben muss?
- Wie übersetze ich die Geschichte mit dem PrivilegeSetBuffer? - Sieht für mich aus, wie das, was man bei Delphi mit dem absolute-Schlüsselwort machen könnte, aber ich bekomm's nicht ans Laufen
- Was soll die ganze Geschichte mit dem MakeAbsoluteSD und was genau müsste an die Stelle von den ganzen TODOs in dem Abschnitt? Wenn ich das richtig interpretiere, hat das Beispiel an der Stelle auch einen Fehler: der aufwändig generierte pAbsoluteSD wird überhaupt nicht benutzt!
- Viele der Objekte, die ich prüfen will (z.B. mailaktivierte Öffentliche Ordner) haben kein objectSID-Attribut, das ich als PrincipalSelfSid übergeben könnte. Ist das in dem Fall verzichtbar? Ist so ein Objekt einfach kein "Principal" und braucht hier keine Wert oder bedeutet das, dass ich die AccessCheck*-Routinen nicht für diese Objekte benutzen kann?
- Brauche ich für meinen Anwendungsfall wirklich AccessCheckByTypeResultList? Würde AccessCheckByType nicht auch ausreichen?
- Egal, welche AccessCheck*-Variante ich verwende, und egal, wie ich die Parameter aufbereite, der Aufruf schlägt immer fehl und GetLastError gibt mir 87 - "The parameter is incorrect" zurück - leider keinen Hinweis darauf, auf welchen der unzähligen Parameter sich das beziehen könnte...
- Bei meinen Recherchen zur Übersetzung des o.g. C++-Beispiels bin ich auf die JWSCL gestoßen, welche offensichtlich Wrapper für die o.g. AccessCheck*-Routinen enthält. Beim Versuch, das o.g. Beispiel mit den Objekten und Methoden der JWSCL (z.B. TJwSecureGeneralObject.AccessCheckByTypeResultList) umzusetzen, scheitere aber wieder an verschiedenen Punkten:
- wenn ich versuche, einen TJwSecurityDescriptor-Wrapper für den PSECURITY_DESCRIPTOR, den ich aus meiner AD-Abfrage erhalten habe, zu erstellen tritt eine EJwsclInvalidSid-Exception auf. Beim Debuggen kann ich sehen, dass dies beim Durcharbeiten der ACEs geschieht (der SD in meinem Beispiel enthält insgesamt 91 davon) - bin ich hiermit vielleicht doch auf dem richtigen Weg und es stimmt nur etwas in unserem AD nicht?
Ist es irgendeiner dieser drei Ansätze wert, weiter verfolgt zu werden? Kann ich damit überhaupt ans Ziel kommen oder gibt es noch einen ganz anderen Weg?
Grüße,
Oliver