Benutzerrechte eines User in einem Verzeichnis
-
Ich habe folgende Idee:
Nach Angabe eines Verzeichnisses soll das Programm ausgeben welcher Benutzer auf dem Computer in dem Verzeichnis Schreib- und welcher Benutzer Leserechte hat.
Ich habe schon das PSDK durchwühlt und bin da auf GetFileSecurity gestossen. Nur wie geht es dann weiter? Irgend wie bin ich dann auch über ACL's gestolpert. Nur wie geht es weiter bzw. wie muss ich die jetzt anwenden, um an die gewünschten Infos zu kommen?
-
Das ist einigermaßen viel händisches Gefummel. Du mußt jedenfalls GetFileSecurity mindestens mit dem Flag DACL_SECURITY_INFORMATION im zweiten Parameter aufrufen, damit der SECURITY_DESCRIPTOR mit den benötigten Infos gefüllt wird. Danach holst Du Dir mit GetSecurityDescriptorDacl die DACL des SECURITY_DESCRIPTORs. Jeder Eintrag in der Liste nennt sich Access Control Entry (ACE). Die Anzahl der ACEs Deiner DACL bekommst Du von GetAclInformation und AclSizeInformation im letzten Parameter (die Anzahl wird über ACL_SIZE_INFORMATION.AceCount geliefert.
Jetzt kannst Du in einer Schleife durch die Liste gehen und Dir die einzelnen ACEs mit GetAce holen. Gültige Werte für den zweiten Parameter liegen im Bereich von 0 <= dwAceIndex < ACL_SIZE_INFORMATION.AceCount - 1.
Ein ACE kann verschiedene Gesichter haben. Vergleichen kannst Du das mit WM_NOTIFY. Hier kann lParam auf alle möglichen Strukturen zeigen. Unterschieden wird wir über NMHDR.code. Ein ACE besteht auch immer aus einem Header, dem ACE_HEADER und unterschieden wird über dessen Feld AceType.
Wird dem User Zugriff gewährt, wird ACE_HEADER.AceType auf ACCESS_ALLOWED_ACE_TYPE gesetzt sein. Du weißt nun, daß der ACE ein ACCESS_ALLOWED_ACE ist. In ACCESS_ALLOWED_ACE.Mask steht nun, was dem User/ der Gruppe erlaubt wird. Um welchen User/ welche Gruppe es geht, steht in ACCESS_ALLOWED_ACE.SidStart. Den SID kannst Du per LookupAccountSid in einen lesbaren String verwandeln.
Ich weiß ja nicht, was Du da vorhast. Aber wenn Du nur prüfen willst, ob Du Zugriff hast, geht das mit AccessCheck wesentlich einfacher.
Wenn es Dir aber wirklich um die Anzeige geht und Du COM kennst und damit umzugehen weißt, gibt es bereits ein fertiges UI für Dich, den Access Control Editor. Mit der Funktion CreateSecurityPage erstellst Du eine PropertyPage, die Du bereits aus den Sicherheitseinstellungen zu Deiner Datei kennst.
-
Ach du meine Güte. Aber ich denke, ich müsste ersteren Weg gehen. Mal sehen, wie weit ich komme.
