윈도우NT Version 6 이상의 커널부터 UAC가 도입되었고, 이때부터 모든 실행파일은 실행할 때 권한체크를 거치게 된다.

일반적으로 EXE파일이 실행될 때 요구되는 권한은 3가지가 존재한다.

 

 

asInvoker : Parent Process의 토큰을 그대로 따라간다. 빌드할 때 기본적으로 설정되어져 있는 UAC Manifest 값이다. 보통 일반적인 어플리케이션의 평범한 실행을 할때 요구되는 권한이다.

 

highestAvailable : 현재 로그인 된 유저의 권한을 따라간다. 예를 들어 현재 로그인 된 유저가 슈퍼관리자라면, 슈퍼관리자의 권한으로 실행하고, 일반 사용자라면 일반 사용자의 권한으로 실행한다.

 

requireAdministrator : 실행되기 위해서는 무조건 관리자 권한이 필요하다.

 

 

오늘 삽질을 좀 하다가, asInvoker UAC Manifest를 가진 프로세스에서 requireAdministrator UAC Manifest를 가진 프로세스를 실행을 해보려고 했다.

CreateProcess를 이용해서 실행하려고 했는데 실패하면서 GetLastError로  에러코드 740을 내뱉는다.

에러코드 740의 내용을 참조해보았더니 다음과 같았다.

 

 

ERROR_ELEVATION_REQUIRED
740 (0x2E4)

The requested operation requires elevation.

권한 상승이 필요하단다.

생각을 해보니 asInvoker 권한만을 가진 프로세스가 requireAdmin 권한을 필요로 하는 프로세스를 정상적으로 실행시키는것이 말이 안되었다. 졸개가 왕에게 명령하는꼴 아닌가?

 

그런데 어디선가 찾아보니 CreateProcess 대신에 Shell API인 ShellExecute를 사용해서 실행시키면 된다고 한다.

그래서 코드를 좀 고쳤다.

 

 

 /*
*
*
*
*   asInvoker.c
*
*
*/

#include <stdio.h>
#include <windows.h>
#include <shellapi.h>
#include <stdlib.h>

int main(void)
{
 STARTUPINFO si;
 PROCESS_INFORMATION pi;

 ZeroMemory(&si, sizeof(si));
 ZeroMemory(&pi, sizeof(pi));
 si.cb = sizeof(si);

 printf("This is a asInvoker process.\n");

 if ( !CreateProcess (
    NULL,
    "requireAdmin.exe",
    NULL,
    NULL,
    FALSE,
    0,
    NULL,
    NULL,
    &si,
    &pi) )
 {

  printf("CreateProcess failed. Error code : %d\n", GetLastError());
  printf("Try to execute using ShellExecute...\n");
  system("pause");

  if ( ShellExecute(NULL, "open", "requireAdmin.exe", NULL, NULL, SW_SHOW) <= (HINSTANCE)32 )
  {
   printf("ShellExecute failed.\n");
   system("pause");
   return EXIT_FAILURE;
  }

  system("pause");
  return EXIT_SUCCESS;
 }

 CloseHandle(pi.hThread);
 CloseHandle(pi.hProcess);
 system("pause");

 return EXIT_SUCCESS;
}

 

 

 

 /*
*
*
*
*   requireAdmin.c
*
*
*/


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 printf("This is a requiredAdmin process.\n");
 system("pause");

 return 0;
}

 

 

 

 

실행을 해보니 asInvoker.exe에서 requireAdmin.exe 프로세스를 정상적으로 실행할 수 있었다.

물론 ShellExecute를 이용해서다.

 

 

 

 

 이때 권한 상태를 보니 아래와 같았다.

 

 asInvoker.exe는  Elevated 되지 않은 상태이다.

 

 

requireAdmin.exe는  Elevated 된 상태이다.

Non-elevated Process에서 실행을 하는데, 자식이 Elevated 될수가 있단 말인가? OS자체에서 그냥 권한을 띄워주는건가?

 

 

부모 자식 관계를 살펴보니 아래와 같았다.

 

ShellAPI로 실행했기 때문에, 부모 자식 관계가 없을줄 알았는데 requireAdmin은 asInvoker의 자식 관계로 생성되었다.

ShellExecute는 내부적으로 어떻게 구현되어져 있길래, 이러한 실행이 가능해지는거지?

ShellAPI에 대해서 좀 조사해봐야 될것 같다.

 

 

저작자 표시 비영리 변경 금지
신고
by Sone 2013.06.01 04:38
| 1 |