2012-10-14 15 views
8

Chciałbym zakodować funkcję, która mówi mi, czy można WRITE plik/folder do określonej ścieżki, czy nie. Chciałbym to zrobić BEZ zapisywania jakichkolwiek plików na dysk. Czy jest do tego funkcja WINAPI? Dziękuję za pomoc.Pobierz Ograniczenia systemu plików

+3

istnieje żadna funkcja, która zrobi. Jeśli potrafisz poruszać się po API bezpieczeństwa, możesz zrobić całkiem niezły krok, sprawdzając to z góry. Zdecydowanie najłatwiejszym sposobem sprawdzenia, czy można napisać do pewnej lokalizacji , jest próba zrobienia tego. –

+4

Mam również do czynienia z tego rodzaju sytuacji. Najpierw oparłem swoje rozwiązanie na sprawdzaniu uprawnień ACL, ale wkrótce doszedłem do wniosku, że jedynym niezawodnym sposobem jest faktycznie spróbować utworzyć plik tymczasowy za pomocą API "GetTempFileName" (lub cokolwiek innego). – kobik

+2

Cóż, włożę CD-ROM, a następnie program, sprawdza ACL. Otrzymujesz prawo do tworzenia plików - ale media po prostu ich nie obsługują. Podobnie jak w przypadku dyskietek chronionych przed zapisem, kart SD itp. ACL to po prostu za mało. Lepiej spróbuj. Ustaw flagi Windows, aby automatycznie usuwać plik przy zamknięciu, jeśli boisz się żyć śmieciami w przypadku błędów. –

Odpowiedz

8
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; 

użyć tego jak: if (CheckFileAccess (SysteemGegevens.DFImportPath, FILE_ALL_ACCESS) <> FILE_ALL_ACCESS) następnie

z

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; 
+3

Czy możesz wyjaśnić, co robi ta funkcja, jakie są parametry wejściowe i jaki jest wynik, proszę? Przy okazji powinieneś sprawdzić wyniki wywołań funkcji Windows API ... – TLama

+0

Wygląda na to, że jest to funkcja przeniesionego CanAccessFolder z powyższej odpowiedzi. –

+1

TLAMA: Przepraszam, dodałem. Benjamin: Nie wiedziałbym, złapał go z naszej bazy kodu –

Powiązane problemy