관리자 권한 실행 - UAC 고려하기

system/windows 2012. 1. 16. 16:31
- 요약
1. ShellExecute runas
2. 링커 리콰이어
3. 매니페스트


- ShellExecute 를 사용 하는 방법

if(IsUserAnAdmin() == FALSE) //프로그램이 관리자 권한인지 알 수 있는 함수
{
//관리자 권한으로 실행 시킨다.
SHELLEXEGUTEINFO si
ZeroMemory(&si, sizeof(SHELLEXECUTEINFO));

si.cbSize = sizeof(SHELLEXECUTEINFO);
si.hwnd = NULL;
si.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI;
si.lpVerb = _T("runas");
si.lpFile = _T("프로그램명");
si.lpParameters = _T("파라미터");
si.nShow = SW_SHOWNORMAL;
si.lpDirectory  = NULL;
ShellExecuteEx(&si);
}

- Visual C++ 2008 일 경우 설정

 Project > Properties 메뉴를  선택
 Linker > Manifest File 항목에서
 Enable User Account Control (UAC)를 Yes로 설정하고
 UAC Execution Level을 requireAdministrator로 설정한다.

- 매니페스트 파일 생성

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.00.0"
     processorArchitecture="X86"
     name="IsUserAdmin"                       
     type="win32"/>
  <description>Description of your application</description>
  <!—어플리케이션 보안 요구 사항을 식별합니다. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>

위의 내용으로 manifest 라는 XML 파일을 생성한다.

name="IsUserAdmin" 여기에 실행파일 명을 명시!!!
level="requireAdministrator" 인 경우 관리자 권한으로 프로그램 실행됨.
level="asInvoker" 인 경우 부모 프로세스와 동일한 토큰으로 실행됨(경험적 결과이나 일반사용자 권한으로 실행됨)


위의 파일을 응용프로그램 안으로 통합하는 방법은 여기 http://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx  를 참고하십시오.


- 출처
http://happybird.tistory.com/13  
 

'system > windows' 카테고리의 다른 글

가상 키 코드(스캔코드) 테이블  (0) 2012.03.06
쉽게 쓴 dll  (0) 2012.02.24
Segmentation 시발점 찾다가  (0) 2011.10.31
110901 긁적긁적  (0) 2011.09.01
dll injection 기초  (0) 2010.09.03
: