#include <stdio.h>
#include <windows.h>
/*
GetCurrentProcessID 得到當前進程的ID
OpenProcessToken 得到進程的令牌句柄
LookupPrivilegeValue 查詢進程的權限
AdjustTokenPrivileges 啓用令牌權限
*/
int main(void)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// 獲取進程的訪問令牌
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return -1;
// 獲得本地機唯一的標識,查看系統權限的特權值,返回信息到一個LUID結構體裏
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// 通知系統修改進程權限,獲取關閉系統權限
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return -2;
// 關閉、重啓、註銷系統等操作
if (!ExitWindowsEx(EWX_LOGOFF,0))
return -3;
CloseHandle(hToken);
return 0;
}
/*
//如果函數成功,返回值爲非零
BOOL ExitWindowsEx( //退出,重啓或註銷系統
UINT uFlags, //關閉參數
DWORD dwReserved //系統保留,一般取0
);
uFlags:
EWX_FORCE: 強制終止進程,不會發送消息給目前在系統中運行的程序
EWX_LOGOFF: 關閉所有進程,然後註銷用戶
EWX_POWEROFF: 關閉系統並關閉電源,該系統必須支持斷電
EWX_REBOOT: 關閉系統,然後重新啓動系統
EWX_SHUTDOWN: 關閉系統,安全地關閉電源
*/