2014년 11월 5일 수요일

PC 재부팅 및 전원끄기(MFC)

BOOL SetShutdownPrivilege()
{
COsVersion OSversion;
if(OSversion.GetVersion() < 1000)
return TRUE;

HANDLE hToken;
TOKEN_PRIVILEGES tkp;

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

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

return TRUE;
}

윈도우 NT 기반에서는 전원을 끄려면 권한이 있어야 한다. 위 코드는 아래의 주소에서도 확인할 수 있다.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa376871(v=vs.85).aspx

SE_SHUTDOWN_NAME 권한을 줘야한다고 써져있다.

권한을 정상적으로 얻으면

ExitWindowsEx( EWX_REBOOT|EWX_FORCE, 0 ); //재부팅
ExitWindowsEx( EWX_SHUTDOWN|EWX_FORCE, 0 ); //종료

위 코드를 호출해주면 된다.

EWX_FORCE를 주지 않으면, 저장해야 될 작업이 있을 경우 종료가 되지 않고 대기한다.

강제 종료를 위해서는 옵션을 주자.

if( SetShutdownPrivilege() )
ExitWindowsEx( EWX_REBOOT|EWX_FORCE, 0 );

댓글 없음: