다음 예는 this article에서 번역됩니다. 파일이나 디렉토리에 모든 사용자에 대해 that article에있는 액세스 권한이있는 경우이를 결정할 수 있으므로 FILE_ALL_ACCESS를 요청하면 모든 사용자가 원하는 파일이나 디렉토리에 대한 전체 액세스 권한을 갖게됩니다. 다음 코드에서는 예외 처리가 없으므로 지난 번 VB를 사용했을 때 기억이 나지 않아서 잘못된 것일 수도 있으므로이 게시물을 수정하여이 게시물을 자유롭게 수정하십시오. 64 비트 윈도우 7 엔터프라이즈 SP에 델파이 2007
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;
function CheckFileAccess(const FileName: string; const CheckedAccess: Cardinal): Cardinal;
var Token: Cardinal;
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;
procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckFileAccess('C:\Windows', FILE_ALL_ACCESS) = FILE_ALL_ACCESS then
ShowMessage('C:\Windows has full access for everyone')
else
ShowMessage('Someone has no full access to C:\Windows');
end;
1
어쨌든 훨씬 더 쉽게 JEDI Windows Security Code Library을 다운로드가 또한 작동 I 희망 (this one 같은 예제를 따라하는 것 전화 번호부 그러나 나는 아주 확실하다).
왜 투표가 중단 되었습니까? 내 질문에 문제가 있습니까? 그것을 고치도록 도와주세요. :) – Kermia
이 질문에 답할 수 없습니다. 그것은 너무 부정확하다. "관리자 권한 수준이 필요합니다"무엇을 할 수 있습니까? 읽다? 쓰기? 지우는 것? 등등. 더 나은 해결책이있을 수 있으므로 왜 이것을 탐지해야하는지 설명 할 수 있습니다. –
질문이 편집되었습니다. – Kermia