Come controllo a livello di codice la creazione dell'autorizzazione file per la cartella? Modifica autorizzazione file? Elimina il permesso di file?
GetNamedSecurityInfo
restituisce che posso scrivere in C:\Program Files
ma UAC dice Access Denied (5)
Come posso determinare in modo efficace le autorizzazioni di accesso?Come controllo a livello di programmazione le autorizzazioni di modifica?
Il mio codice:
function GetAccessRights(const FileName: String; ObjectType: SE_OBJECT_TYPE;
var Access: Cardinal): Cardinal;
var
SecDesc: PSECURITY_DESCRIPTOR;
pDacl: PACL;
Trusteee: TRUSTEE_;
begin
result := GetNamedSecurityInfo(PChar(FileName), ObjectType,
DACL_SECURITY_INFORMATION, nil, nil, @pDacl, nil, SecDesc);
if ERROR_SUCCESS = result then
begin
// the pDacl may be NULL if the object has unrestricted access
if pDacl <> nil then
begin
with Trusteee do
begin
pMultipleTrustee := nil;
MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
TrusteeForm := TRUSTEE_IS_NAME;
TrusteeType := TRUSTEE_IS_UNKNOWN;
ptstrName := 'CURRENT_USER';
end;
result := GetEffectiveRightsFromAcl(pDacl^, Trusteee, Access);
end
else
begin
Access := $FFFFFFFF;
result := ERROR_SUCCESS;
end;
if SecDesc <> nil then
LocalFree(Cardinal(SecDesc));
end;
end;
* È più facile chiedere perdono che non ottenere l'autorizzazione * –
Il perdono non è richiesto per 'Programmi '. Windows scrive il file in Virtual Store. – barbaris
Per cosa? Se hai una GUI in cui desideri visualizzare queste informazioni, devi sapere se hai i permessi, non hai scelta; Se è necessario effettivamente * scrivere * qualcosa, non c'è niente di meglio da provare: creare un file temporaneo e quindi cancellarlo. Dubito che qualcos'altro sia veramente affidabile, suggerimento: chi può dire in modo affidabile se si ha accesso in scrittura su un drive di rete mappato, quando il software server è Samba? Anche con l'accesso completo ai file di configurazione potrebbe essere complicato! –