본문 바로가기

프로그래밍/Delphi

[델파이/Tips] 관리자 권한으로 실행하기

[델파이/Tips] 관리자 권한으로 실행하기

  (Elevated privileges for Delphi applications)

   > 디바이스를 변경할 수 있도록 허용 하시겠습니까? 사용자 계정 컨트롤 창의 제어

1. 개요 

  델파이(Delphi)로 작성된 프로그램에서 인터넷 또는 시스템 자원에 대한 엑세스(Access)를 실행할 경우에 사용자 권한 문제로 인해 다음과 같은 화면이 노출되어 진행이 멈추는 현상들이 있다. Administrator 계정으로 로그인 했음에도 불구하고 대부분의 일반적인 응용 프로그램은 같은 메시지 창을 마주하게 될 것이다. 

  이를 해결 하는 방법은 PC 설정에서 UAC(User Account Control) 설정을 끄면 해결할 수 있지만 보안상 바람직하지 않다고 판단하여 프로그램 컴파일 단계에서 관리자 권한을 획득하여 실행하게 하여 아래와 같은 "계정 컨트롤" 창이 팝업되지 않도록 하는 방법을 제시한다.

  이 방법은 델파이로 컴파일된 VCL Application 또는 FMX Application에 동일하게 동작한다. 다만 FMX는 당연히 윈도우 버전만 해당 된다.

사용자 계정 컨트롤 설정 끄지 말아야 합니다

Windows Vista의 사용자 계정 컨트롤(User Account Control : UAC)

윈도우10 사용자 계정 컨트롤 끄기



2. 관리자 권한(Administrator Account)을 획득한 상태로 컴파일하게 하는 방법


1) VCL 어플리케이션 만들기 (프로젝트명 = prjUACTest.dproj (예)

  "File>New>VCL Application Delphi" 메뉴를 이용하여 대상 어플리케이션 프로젝트 생성

[VCL 프로젝트 생성]

  프로젝트명(중요함)prjUACTest  (이 프로젝트명은 .manifest 파일 내에서 사용된다(.exe제외))

     > 작성된 프로젝트 명이 사용된다는 의미임.


2) 권한 상승 처리를 위한 ".manifest" 파일을 프로젝트에 추가

  - File>New>Other 의 "New Items"에서 "Text File" 선택

  - 이 파일은 일반 텍스트 편집기를 이용하여 .manifest 파일을 만들어서 프로젝트에 추가 해도 됨.

- 파일 저장 : 저장시 확장자를 ".manifest"로 지정하여 저장하고 프로젝트명과 동일한 파일명으로 프로젝트에 추가

   --> "prjUACTest.manifest"


3) .manifest 파일 내용을 다음 TEXT로 대체



  
  My App Description
  
  
    
      
        
      
    
  

  위 xml 파일중 변경해야 할 부분은 우리가 작성한 UAC를 상승시킬 프로젝트명 "prjUACTest"를 <assemblyIdentity 태그의 "name" 속성 값에 지정해 주어야 한다는 것.

<assemblyIdentity type="win32" name="prjUACTest" version="1.0.0.0" processorArchitecture="x86"/>


4) 프로젝트에서 사용자가 작성한 .manifest 파일을 사용하도록 지정

   - 프로젝트 옵션에서 Application 선택

   - ManifestFile 섹션에서 사용자 지정(Custom) ManifestFile을 사용하도록 하고, 하단에 Custom manifest에서 위에서 작성된 "prjUACTest.manifest"파일을 지정하면 된다.


5) 컴파일 및 실행

  - 컴파일 후 DelphiXE IDE에서 디버깅 모드로 실행을 하면 다음과 같이 권한상승이 필요하다는 메시지가 나오며 실행이 안된다.

  - 디버깅 모드 말고 외부에서 직접 실행파일 "prjUACTest.exe"파일을 실행 하면 다음과 같이 관리자 권한을 획득 할 것인지를 묻는 창이 나오게 되며 이후 관리자 권한으로 응용 어플리케이션이 실행 된다.

  - 디버깅 모드에서 관리자 권한을 획득하도록 실행하는 방법

    . 디버깅 시만 프로젝트 옵션에서 런타임 테마 사용으로 복원하고 릴리즈 프로파일로 변경후 사용자 정의 manifest 사용을 설정 및 파일 선택 후 실행 하는 방법

    . 델파이 IDE 실행 자체를 관리자 권한으로 실행하는 방법

 


  여기까지가 작성된 응용 프로그램이 관리자 권한을 획득하며 실행하기 위한 과정이다.


3. 응용프로그램 Luncher를 이용한 관리자 권한으로 프로그램 실행

  프로젝트 자체에 관리자 권한으로 실행 할 수 있도록 UAC를 탑재하는 방법외에 다음과 같은 Luncher함수를 이용하여 일반 응용 어플리케이션을 관리자 권한을 가지고 실행할 수 있도록 할 수 있다.


function RunAsAdmin(filename: string; Parameters: string) : Boolean;
var
    sei: TShellExecuteInfo;
begin
    ZeroMemory(@sei, SizeOf(sei));
    sei.cbSize := SizeOf(TShellExecuteInfo);
    sei.Wnd := 0;
    sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
    sei.lpVerb := PChar('runas');
    sei.lpFile := PChar(Filename); // PAnsiChar;
    if parameters <> '' then
        sei.lpParameters := PChar(parameters); // PAnsiChar;
    sei.nShow := SW_SHOWNORMAL; //Integer;

    Result := ShellExecuteEx(@sei);
end;

// 실행예)
procedure TForm3.Button1Click(Sender: TObject);
begin
  RunAsAdmin('prjUACTest.exe', '');
  RunAsAdmin('notepad.exe', '');
end;




다음에는 ...

다음에는 관리자 권한을 획득 하지만 이 창이 나오지 않도록 하는 방법을 더 알아보자. 왜냐하면 실행시마다 사용자 계정 컨트롤 창을 확인하고 "예" 버튼을 눌러줘야 해서 자동화 프로그램에는 적절치 않기 때문이다.