본문 바로가기

work/delphi

Vista/Windows7 에서의 관리자 권한 상승

Vista 이상 운영체제에서는 하드디스크에 어떤 파일을 생성한다거나, 혹은 레지스트리를 조작하는등 시스템에 어떤 변화를 주는 행위를 하고자 할 때에는 관리자 권한으로 실행하지 않으면 권한 오류로 인해 프로그램 오류를 유발시킨다.

이때문에 프로그램을 실행할때 관리자 권한으로 실행하도록 유도해야 하는데, 기본적으로 프로그램은 일반 유저모드로 실행이 되기 때문에 프로그램을 사용하는 사용자에게 "관리자 권한"으로 실행할 것을 인지시켜주지 않으면 예기치 않은 오류를 발생시킬 수 있다.

Vista 이상의 운영체제에서 프로그램을 관리자 권한으로 실행시키기 위해 프로그램 실행전에 사용자에게 묻게 하는 행위를 하도록 하는것은 생각보다 매우 간단하다.

사용자 삽입 이미지
 프로젝트를 생성하게 되면 기본적으로 "프로젝트명.res" 파일이 생성이 되는데 해당 파일의 내용을 보면 왼쪽의 이미지와 같이 "24"라는 형태의 리소스가 자동으로 포함되게 된다.

해당 리소스 파일의 내용중 프로그램을 실행하는데 있어서 필요한 권한을 설정해주는 Manifest 에 "asInvoker"라고 되어 있는 부분 때문에 사용자 모드로 프로그램이 실행되게 되는 것이다.

해당 리소스 내용을 복사한후, 삭제해버리자.

그 리고 우리가 만든 리소스 파일을 추가해주면 된다. 관리자 권한으로 실행할 수 있도록 말이다.

원래의 리소스 파일에서 Manifest부분을 추출하면 아래와 같다.(컴파일러마다 다를 수 있음)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="CodeGear RAD Studio"
    version="11.0.2902.10471"
    processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker" => "requireAdministrator" 로 변경하여 준다.
          uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>


위와 같이 수정이 완료되었다면 이제 리소스 파일을 만들어 프로젝트에 추가하도록 하자.

1. 해당 파일을 "프로젝트명.manifest"라고 저장한다.


2. "프로젝트명.RC"파일을 만든다.
1 24 "프로젝트 명.manifest"


3. 리소스 컴파일을 한다. BRCC32 "프로젝트명.RC" -o "프로젝트명.elv"


4. 프로젝트 파일에 리소스를 추가하여 준다.

   {$R *.res}
   {$R '프로젝트명.elv' '프로젝트명.rc'}


이제 만들어진 응용 프로그램을 Vista 또는 Windows7에서 실행시켜보자.
예전에는 묻지 않던 관리자 권한으로의 실행 여부를 묻는 다이얼로그 창이 나타나게 될 것이다.

헌데, 해당 리소스 파일을 만들어 작업을 하게되면 Build시 아래와 같이 Warning Error를 볼 수 있게 된다.
(사실 이 부분을 설명하기 위해 앞의 내용을 작성한 것이다. 이 포스팅에서는 아래의 부분이 내가 말하고 싶었던 부분 -_-;)

[DCC Error] E2161 Warning: Duplicate resource:  Type 24 (user-defined), ID 1; File D:\Grissom.Kim\My Documents\RAD Studio\Projects\프로젝트명.elv resource kept; file D:\Grissom.Kim\My Documents\RAD Studio\Projects\프로젝트명.res resource discarded.

저 Warning 에러는 어떻게 없애야 하는가?

Project -> Option -> Application 다이얼로그 창을 띄운후 해당 다이얼로그에서 "Enable Runtime themes" 부분을 Uncheck해주면 된다.

이제 Warning Error가 사라지고 깔끔하게 Build 되는 것을 볼 수 있다.


출처 : http://dolba.net/tt/k2club/entry/UAC-And-Duplicate-Resource