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;
}