본문 바로가기

Application Dev./C++/MFC

윈도우 강제(자동)종료, 재부팅, 로그오프

TOKEN_PRIVILEGES ns;
HANDLE htoken;
LUID LID;
LUID_AND_ATTRIBUTES att;


if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken))
{
   MessageBox("Process token을 열 수 없습니다.\n");
   return;
}

if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &LID))
{
   MessageBox("Privilege를 찾을 수 없습니다.\n");
   return;
}

// Shutdown privilege 활성화
att.Attributes = SE_PRIVILEGE_ENABLED;
att.Luid       = LID;

// Privilege 업데이트를 위함
ns.PrivilegeCount = 1;
ns.Privileges[0] = att;

if(AdjustTokenPrivileges(htoken, FALSE, &ns, NULL, NULL, NULL))
{
   //로그아웃의 경우, 굳이 이렇게 할필요 없음. (아래 함수만 써도 됨)
   //Win98의 경우 함수의 호출만으로 종료가 가능하다.

   //EWX_POWEROFF, EWX_LOGOFF
   ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);
}
else
{
   MessageBox("Privilege를 컨트롤 할 수 없습니다.\n");
   return;
}