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.


Anmelden zum Antworten