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
Odpowiedz
Można użyć GetFileSecurity() i AccessCheck() funkcje. Przeczytaj artykuł Aarona Ballmana na How to Check Access Rights. Dostarczył funkcję CanAccessFolder()
, aby wykonać to, o co prosiłeś.
dziękuję. Tego właśnie szukałem! –
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;
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
Wygląda na to, że jest to funkcja przeniesionego CanAccessFolder z powyższej odpowiedzi. –
TLAMA: Przepraszam, dodałem. Benjamin: Nie wiedziałbym, złapał go z naszej bazy kodu –
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. –
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
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. –