Notice»

Recent Post»

Recent Comment»

Recent Trackback»

Archive»

« 2024/3 »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

윈도우 비스타 권한상승(Elavation) 방법 (administrator 권한을 갖게 하는 방법)


아래문서 하나면 다된다.

Windows Vista 상에서 ActiveX Control 개발 방법 (Word 문서, 963KB)



1. manifest를 실행파일에 포함시킨다.

UAC는 DLL은 검사하지 않는다.


1) manifest을 리소스에 포함

vs2005이상 부터는 manifest가 자동생성되며 프로젝트 속성을 통해 간단히 해결가능하다.

아래 코드와 같은 manifest파일이 같이 생성되는 걸 확인할 수 있을것이다.


아직 VC6을 사용중이라면 manifest resource에 추가하자.

(프로젝트명).exe.manifest와 같은 파일을 아래의 내용으로 만들자.


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
    processorArchitecture="x86"
    name="프로젝트명(실행파일 명)"
    type="win32"
/>
<description>Description of your application</description>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel
          level="사용자 레벨설정"
          uiAccess="false"
            />
    </requestedPrivileges>
  </security>
</trustInfo>
</assembly>

사용자 레벨설정의 종류와 의미는 아래와 같다.

asInvoker어플리케이션이 부모 프로세스와 동일한 토큰으로 실행됩니다.

highestAvailable어플리케이션이 현재 사용자가 사용할 수 있는 최고 권한으로 실행됩니다.

requireAdministrator어플리케이션이 관리자에 대해서만 실행되므로 관리자의 전체 토큰으로 어플리케이션을 시작해야 합니다.


프로젝트 폴더안의 resource.h 파일안에서 아래와 같이 디파인하고

#define MANIFEST_RESOURCE_ID   1

(프로젝트명).rc 파일안에 다음을 집어넣는다.

MANIFEST_RESOURCE_ID    24      MOVEABLE PURE   "(프로젝트명).exe.manifest"


2) 2005이상에 설치된 mt.exe를 이용하자.

없으면 다운받아 설치한다.


위에서 만든 AdminApp.exe.manifest파일을 AdminApp.exe파일과 같은 위치에 놓고

명령창에서 아래와 같이 입력한다.

mt -manifest AdminApp.exe.manifest -outputresource:AdminApp.exe;#1



위와 같이 하면 생성된 exe파일에 윈도우 방패 모양의 아이콘이 추가된걸 확인할수 있다.(Vista이상에서..)

운영체제는 실행 시 실행 파일의 manifest를 검사해서 권한 상승이 필요하다고 표시된 경우 권한 상승을 시도한다.



2. 응용프로그램을 shellexecute를 이용 administrator 권한 주며 실행하기


예제 함수)   RunAsAdmin( NULL, regsvr32.exe, weblobby.exe )

RunAsAdmin( HWND hWnd, LPTSTR lpFile, LPTSTR lpParameters )

{

        SHELLEXECUTEINFO exeset;

        ZeroMemory(&exeset, sizeof(exeset));

       

        exeset.cbSize = sizeof(SHELLEXECUTEINFOW);

        exeset.hwnd = hWnd;

        exeset.fMask = SEE_MASK_FLAG_DDEWAIT|SEE_MASK_FLAG_NO_UI;

        exeset.lpVerb = _TEXT("runas");

        exeset.lpFile = lpFile;

        exeset.lpParameters = lpParameters;

        exeset.nShow = SW_SHOWNORMAL;

       

        if(!ShellExecuteEx(&exeset))

        {

           return FALSE;

        }

        return TRUE;

}


참고
응용 프로그램에서 Windows Vista 사용자 계정 컨트롤 사용 (MSDN)

: