2011-08-02 4 views
0

관리자 권한 수준 (Delphi 사용)이 필요한 경우 폴더를 검색하고 싶습니다. 가능한가?폴더의 권한 수준을 얻는 방법은 무엇입니까?

편집

는이 코드를 썼다. 이것은 내가 원하는 것입니다. 하지만 Windows 표준 기능을 사용하여이 작업을 수행하고 싶습니다.

// Check if You need Administrator-level access to create a folder 
try 
    mkdir(SDirectory + '\~TEST'); 
except 
    on E: exception do 
    begin 
    if E.message = 'File access denied' then 
    begin 
     MessageBox(self.Handle, 
     'You need Administrator-level access to create this folder', '', MB_ICONERROR); 
     exit; 
    end; 
    end; 
end; 
RmDir(SDirectory + '\~TEST'); 
+2

왜 투표가 중단 되었습니까? 내 질문에 문제가 있습니까? 그것을 고치도록 도와주세요. :) – Kermia

+2

이 질문에 답할 수 없습니다. 그것은 너무 부정확하다. "관리자 권한 수준이 필요합니다"무엇을 할 수 있습니까? 읽다? 쓰기? 지우는 것? 등등. 더 나은 해결책이있을 수 있으므로 왜 이것을 탐지해야하는지 설명 할 수 있습니다. –

+0

질문이 편집되었습니다. – Kermia

답변

6

다음 예는 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; 

enter image description here
1


어쨌든 훨씬 더 쉽게 JEDI Windows Security Code Library을 다운로드가 또한 작동 I 희망 (this one 같은 예제를 따라하는 것 전화 번호부 그러나 나는 아주 확실하다).

2

델파이 XE2 이상으로 이동 한 사람들을 위해 위의 예에서 약간 변경되었습니다 (토큰은 추기경과 더 이상 작동하지 않으며 THandle이어야합니다).

function getFileAccess(...):Cardinal; 
var 
    Token: THandle;//No longer Cardinal 
begin 
    { ... code ...} 
    if GetFileSecurity({...params...}) then 
    begin 
     //... more stuff 
     OpenThreadToken(GetCurrentThread,TOKEN_QUERY,false,Token); 
     if Token<>0 then 
     begin 
      //... more stuff 
      AccessCheck(SecDesc,Token,CheckedAccess,Mapping,PrivSet,PrivSetSize,Access,Status); 
      CloseHandle(Token); 
      //... more stuff 
     end; 
    end; 
    //....more stuff 
end; 
관련 문제