17 Jun
2015
Posted in: 코드
By    No Comments

[플밍노트] 윈도우 종료시키기


[플밍노트] 윈도우 종료시키기
by 신영진(YoungJin Shin), codewiz at gmail.com, @codemaru, http://www.jiniya.net

프로그램을 작성하다 보면 종종 윈도우 시스템을 종료 시켜야 하는 상황이 발생합니다. Windows 9x의 경우에는 단순히 ExitWindowsEx API를 호출함으로써 윈도우를 종료 할 수 있으나, NT 계열에서는 그게 되지 않습니다. 그 이유는 NT 계열에서 도입된 권한 체계 때문입니다. 시스템을 종료시키는 API를 사용하려면 Shutdown 권한을 가지고 있어야 합니다. 아래 코드는 NT 계열에서 Shutdown 권한 획득후 윈도우를 종료 시키는 방법을 보여주고 있습니다.

ExitWindowsExHelper 함수

소스 코드 다운로드

void ExitWindowsExHelper() 
{ 
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 

    // Get a token for this process. 
    if (!OpenProcessToken(GetCurrentProcess()
                         ,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
        return; 


    // Get the LUID for the shutdown privilege. 
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); 

    tkp.PrivilegeCount = 1;  // one privilege to set 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

    // Get the shutdown privilege for this process. 
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); 

    // Cannot test the return value of AdjustTokenPrivileges. 
    if (GetLastError() != ERROR_SUCCESS) 
        return; 

    ExitWindowsEx(EWX_POWEROFF, 0); 
} 


  • 트랙백 주소: http://www.jiniya.net/wp/archives/4072/trackback

관련 글