Vorrei scrivere una funzione che indichi se è possibile scrivere un file o una cartella su un percorso specifico oppure no. Mi piacerebbe farlo SENZA scrivere effettivamente qualsiasi file sul disco. Esiste una funzione WINAPI per questo? Grazie per il vostro aiuto.Ottieni restrizioni file system
risposta
È possibile utilizzare le funzioni GetFileSecurity() e AccessCheck(). Leggi l'articolo di Aaron Ballman su How to Check Access Rights. Ha fornito la funzione CanAccessFolder()
per fare ciò che hai chiesto.
grazie. Questo è quello che stavo cercando! –
function CheckFileAccess(const FileName: string; const CheckedAccess: Cardinal): Cardinal;
var Token: THandle;
Status: LongBool;
Access: Cardinal;
SecDescSize: Cardinal;
PrivSetSize: Cardinal;
PrivSet: PRIVILEGE_SET;
Mapping: GENERIC_MAPPING;
SecDesc: PSECURITY_DESCRIPTOR;
begin
Result := 0;
GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, nil, 0, SecDescSize);
SecDesc := GetMemory(SecDescSize);
if GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, SecDesc, SecDescSize, SecDescSize) then
begin
ImpersonateSelf(SecurityImpersonation);
OpenThreadToken(GetCurrentThread, TOKEN_QUERY, False, Token);
if Token <> 0 then
begin
Mapping.GenericRead := FILE_GENERIC_READ;
Mapping.GenericWrite := FILE_GENERIC_WRITE;
Mapping.GenericExecute := FILE_GENERIC_EXECUTE;
Mapping.GenericAll := FILE_ALL_ACCESS;
MapGenericMask(Access, Mapping);
PrivSetSize := SizeOf(PrivSet);
AccessCheck(SecDesc, Token, CheckedAccess, Mapping, PrivSet, PrivSetSize, Access, Status);
CloseHandle(Token);
if Status then
Result := Access;
end;
end;
FreeMem(SecDesc, SecDescSize);
end;
si utilizza questo tipo: se (CheckFileAccess (SysteemGegevens.DFImportPath, FILE_ALL_ACCESS) <> FILE_ALL_ACCESS) poi
con
const
FILE_READ_DATA = $0001;
FILE_WRITE_DATA = $0002;
FILE_APPEND_DATA = $0004;
FILE_READ_EA = $0008;
FILE_WRITE_EA = $0010;
FILE_EXECUTE = $0020;
FILE_READ_ATTRIBUTES = $0080;
FILE_WRITE_ATTRIBUTES = $0100;
FILE_GENERIC_READ = (STANDARD_RIGHTS_READ or FILE_READ_DATA or
FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE);
FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or
FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or SYNCHRONIZE);
FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or
FILE_EXECUTE or SYNCHRONIZE);
FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF;
Puoi spiegare cosa fa questa funzione, quali sono i parametri di input e qual è il risultato, per favore? Btw., È necessario verificare i risultati delle chiamate della funzione API di Windows ... – TLama
Questa sembra essere la funzione CanAccessFolder trasferita dalla risposta sopra riportata. –
TLama: Siamo spiacenti, aggiunto. Benjamin: non lo saprei, l'ho preso dalla nostra base di codice –
- 1. Dimensione blocco file system
- 2. CSV restrizioni prima cella
- 3. File system distribuito per. NET
- 4. Memoria database vs file system
- 5. Inserimento di file system Android
- 6. Accelerazione dell'accesso al file system?
- 7. File system filename escape? C#
- 8. File system C++ 11 (VS2012)
- 9. File system basato su tag
- 10. Ottieni permessi di sistema Android inserendo app in/system/app?
- 11. Trova tipo f con restrizioni
- 12. restrizioni di tipo unboxed
- 13. UIGestureRimascie restrizioni movimenti
- 14. Restrizioni stringa preservazione Regex
- 15. Elenco dei limiti/restrizioni Silverlight
- 16. Javascript salva dati nel file system (con prompt utente)
- 17. File system che utilizza tag anziché cartelle?
- 18. SQLITE Blob OR file system per immagini
- 19. come trovare un loop nel file system?
- 20. Access node.js Modulo file system in Meteor
- 21. Archivia il file su System uri?
- 22. Implementazione del file system di base
- 23. File system in memoria per Windows
- 24. Android - File system di sola lettura IOException
- 25. Accesso al file system in Service Fabric
- 26. controllo file system chrome - ricarica cambio
- 27. Identificazione del file system root con Node.js
- 28. Accesso non bloccante al file system
- 29. Memorizzazione delle immagini: MongoDb vs File System
- 30. Strutture dati utilizzate per creare file system?
Non esiste un'unica funzione che lo farà. Se riesci a navigare nell'API di sicurezza, puoi fare un bel tentativo di controllarlo in anticipo. Di gran lunga il modo più semplice per sapere se è possibile o meno scrivere in qualche posizione è tentare di farlo. –
Ho anche affrontato questo tipo di situazione. per prima cosa ho basato la mia soluzione sul controllo delle autorizzazioni ACL, ma presto ho capito che l'unico modo affidabile è provare e creare un file temporaneo utilizzando l'API 'GetTempFileName' (o qualsiasi altra cosa). – kobik
Bene, inserisco il CD-ROM, quindi il tuo programma, controlla ACL. Hai il diritto di creare i tuoi file - ma il supporto non lo supporta. Idem per i floppy protetti da scrittura, le schede SD, ecc. ACL non è sufficiente. Meglio provare. Imposta i flag di Windows per eliminare automaticamente il file alla chiusura, se hai paura di vivere la spazzatura in caso di errori. –