#include <windows.h>
//使能關機特權函數
BOOL EnableShutdownPrivilege()
{
HANDLE hProcess = NULL;
HANDLE hToken = NULL;
LUID uID = {0};
TOKEN_PRIVILEGES stToken_Privileges = {0};
hProcess = ::GetCurrentProcess(); //擷取目前應用程式程序句柄
if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken)) //打開目前程序的通路令牌句柄(OpenProcessToken函數調用失敗傳回值為零)
return FALSE;
if(!::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID)) //擷取權限名稱為"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函數調用失敗傳回值為零)
stToken_Privileges.PrivilegeCount = 1; //欲調整的權限個數
stToken_Privileges.Privileges[0].Luid = uID; //權限的LUID
stToken_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //權限的屬性,SE_PRIVILEGE_ENABLED為使能該權限
if(!::AdjustTokenPrivileges(hToken,FALSE,&stToken_Privileges,sizeof stToken_Privileges,NULL,NULL)) //調整通路令牌裡的指定權限(AdjustTokenPrivileges函數調用失敗傳回值為零)
if(::GetLastError() != ERROR_SUCCESS) //檢視權限是否調整成功
::CloseHandle(hToken);
return TRUE;
}
//關機函數
BOOL Shutdown(BOOL bForce)
EnableShutdownPrivilege(); //使能關機特權函數
if(bForce)
return ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0); //強制關機
else
return ::ExitWindowsEx(EWX_SHUTDOWN,0);
//登出函數
BOOL Logoff(BOOL bForce)
return ::ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0); //強制登出
return ::ExitWindowsEx(EWX_LOGOFF,0);
//重新開機函數
BOOL Reboot(BOOL bForce)
return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0); //強制重新開機
return ::ExitWindowsEx(EWX_REBOOT,0);
int main()
Logoff(FALSE); //登出
Reboot(FALSE); //重新開機
Shutdown(FALSE); //關機
Logoff(TRUE); //強制登出
Reboot(TRUE); //強制重新開機
Shutdown(TRUE); //強制關機
return 0;