본문 바로가기

툴-팁

[번역] UAC가 설정되어 있을 때, 프로세스를 관리자 권한으로 실행시키는 방법

반응형

http://msdnrss.thecoderblogs.com/2013/03/how-to-launch-a-process-as-a-full-administrator-when-uac-is-enabled/


UAC가 설정되어 있을 때, 프로세스를 관리자 권한으로 실행시키는 방법

How to launch a process as a Full Administrator when UAC is enabled?


2013년 5월 10일 번역 daewonyoon

Posted by Code Monkey on March 23, 2013



비스타에서 사용자 접근 제한(UAC)이 도입되면서, UAC가 활성화된 상태에서는 자동적으로 완전한 관리자로 프로세스를 실행할 수 없게 되었다. 일반적으로는, (현재 사용자가 관리자가 아닐 때) 다음과 같은 API 호출을 거쳐 관리자로 프로세스를 실행하게 된다.

 

With the introduction of User Access Control (UAC) with Windows VISTA, the ability to launch a process as a full administrator when UAC was enabled doesn’t automatically happen anymore.  Typically, you make the following API calls to launch a process as an Administrator (if the current user is not an administrator):


  1. 관리자 그룹에 속한 사용자를 지정하여 LogonUser 를 호출한다.
  2. LogonUser 에서 반환된 토큰으로 CreateProcessAsUser 를 호출한다.


  1. You call LogonUser() where you specify a user who belongs to the administrator group.
  2. CreateProcessAsUser() with the token returned from LogonUser().


이 코드를 XP에서 윈도우8 까지 각각의 운영체제에서 실행하면, 각기 다른 결과를 얻게 된다. XP에서는 관리자로 실행되겠지만, 윈도우8에서는 관리자로 실행되지 않는다.


If you run this code on Windows XP versus Windows 8, you are going to see different results.  The resultant process on Windows XP will be running as administrator while on Windows 8, the user will NOT be running as an Administrator.


상기해야 할 몇가지를 말해 보자면, UAC는 대화형 로그온에만 영향이 있다. (이는 LogonUser의 로그온 타입에 LOGON32_LOGON_INTERACTIVE 로 지정되어 있다.)이것은 서비스에서도 볼 수 있는데, 관리자로 설정된 서비스는 관리자로 실행된다. 실행하는 프로세스가 확실하게 관리자로 실행되도록 하는 한 방법은 서비스를 사용하거나, 배치 로그온 타입을 사용하는 것이다. 또 다른 한가지 방법은 관리자 그룹에 속한 사용자의 관리자 토큰에 관리자 토큰이 들어 있다는 것을 이용하면 된다. 윈도우는 UAC가 활성화 되어 있다고 해서 디폴트로 사용하지 않는다. 프로그램적으로 TokenLinkedToken를 토큰 정보 클래스로 지정하여 GetTokenInformation함수를 호출하여 관리자 토큰을 얻을 수 있다. 이 동작은 아무나 실행할 수 없도록, 호출하는 프로세스가 SeTcbPrivilege 권한을 가지고 있어야 한다. 그래서 인터렉티브 토큰을 이용해 프로세스를 관리자로 실행하는 방법은 다음과 같다.


A couple of things to note, UAC only impacts Interactive logons.  (This is specified by the logon type in LogonUser, LOGON32_LOGON_INTERACTIVE).  You can see this with services, a service configured for an Administrator runs as an Administrator.  One way to make sure your launched process is running as an Administrator is to use a Service or Batch logon type.  The other way is to launch a process as an Administrator is to realize that the Administrator Token for a user who belongs to the Administrator group is embedded in their token.  Windows just doesn’t use it by default when UAC is enabled.  You can programmatically retrieve the Administrator Token via the GetTokenInformation() call and specifying TokenLinkedToken as the token information class.  This operation requires the caller to have the SeTcbPrivilege so not any user can make this call.  The new steps to launch a process as an administrator with an interactive token are:



  1. SeTcbPrivilege 권한이 있고, 활성화 되어 있어야 한다.
  2. LogonUser를 LOGON32_LOGON_INTERACTIVE 로 호출한다.
  3. GetTokenInformation을 LogonUser에서 반환한 토큰과 TokenLinkedToken 인자를 주어 실행한다.
  4. CreateProcessAsUser 를 반환된 토큰으로 실행한다.


  1. You must have the SeTcbPrivilege and it must be enabled. 
  2. LogonUser() with LOGON32_LOGON_INTERACTIVE
  3. GetTokenInformation() with the token returned from LogonUser() specifying the TokenLinkedToken class.
  4. CreateProcessAsUser() with the token returned from GetTokenInformation().


SeTcbPrivilege 가 없더라도, TokenLinkedToken 은 얻어질 것이다. 그러나 얻어진 토큰은 IDENTIFY 레벨의 토큰이기 때문에 CreateProcessAsUser 호출이 실패할 것이다.


If you don’t have the SeTcbPrivilege(), you will still be able to obtain the TokenLinkedToken but it will result in an IDENTIFY level token which will fail in the call to CreateProcessAsUser().


728x90