Das Recht eine Datei zu löschen
-
Hallo!
Ich suche eine Möglichkeit hauszufinden, ob mein Programm bzw. der aktuelle User das NT/2000/XP-Benutzerrecht hat, eine bestimmte Datei zu löschen. Ich habe auch schon mit GetNamedSecurityInfo und GetEffectiveRightsFromAcl mir eine ACCESS_MASK ermittelt. Leider liefert mir diese zurück, dass ich die gesuchte Datei löschen darf, obwohl später die Funktion DeleteFile meldet "Zugriff wurde verweigert" (was laut NT-Berechtigung auch stimmt).
Mein Code sieht so aus:
PSID psidOwner, psidGroup; PACL pDacl, pSacl; PSECURITY_DESCRIPTOR pSID; GetNamedSecurityInfo( strFile.c_str(), // name of the object SE_FILE_OBJECT , // type of object DACL_SECURITY_INFORMATION, // type of security information to retrieve &psidOwner, // receives a pointer to the owner SID &psidGroup, // receives a pointer to the primary group SID &pDacl, // receives a pointer to the DACL &pSacl, // receives a pointer to the SACL &pSID // receives a pointer to the security descriptor ); TRUSTEE trustee; ACCESS_MASK accessmask; trustee.pMultipleTrustee = NULL; trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; trustee.TrusteeForm = TRUSTEE_IS_NAME; trustee.TrusteeType = TRUSTEE_IS_USER; trustee.ptstrName = "CURRENT_USER"; dErr = GetEffectiveRightsFromAcl( pDacl, // ACL to get trustee's rights from &trustee, // trustee to get rights for &accessmask // receives trustee's access rights );
Ich bekomme die Accessmask 0x1F01FF zurückgeliefert und prüfe ich auf Bit 16.
Kennt jemand eine andere Möglichkeit dieses herauszufinden? Mal "zur Probe" löschen ist keine Lösung.
-
GetEffectiveRightsFromAcl() verhält sich zwischen den verschiedenen OS-Versionen doch recht unterschiedlich. Wenn ich da so in die KB schaue, dann schüttelt es mich. Der empfohlene Weg führt über AccessCheck(). Bedenke aber, daß Du dieser Funktion ein Impersonation-Token übergeben mußt!
-
Danke!
Ich habe schon an mir gezweifelt. Auf die Idee, das es an einer "unzuverlässigen" API-Funktion liegt, wäre ich nie gekommen. Stimmt aber: Nur unter NT lief es nicht korrekt, 2000 und XP haben funktioniert.
Der AccessCheck-Weg ist zwar etwas aufwendiger, funktioniert aber prima.