#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: 关闭系统,安全地关闭电源
*/
#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: 关闭系统,安全地关闭电源
*/