关机注销重启都是windows的重要操作,所以调用ExitWindowsEx这个函数之前一定要对当前进程进行提权,就是提升权限,使得当前的进程能操作这些重要的函数.
1.提权
//提权函数
BOOL AdjustPrivilege()
{
BOOL bRet = FALSE;
TOKEN_PRIVILEGES tp = { 0 };//令牌权限结构
HANDLE hToken = nullptr;//令牌句柄
do
{
//打开当前进程令牌,并且获取它 //令牌权限修改和查询
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|
TOKEN_QUERY,&hToken))
break;
//获取关机注销重启的LUID(Locally Unique Identifier),局部唯一标识
if (!LookupPrivilegeValue(nullptr,SE_SHUTDOWN_NAME,&tp.Privileges[0].Luid))
break;
tp.PrivilegeCount = 1;//修改权限的个数
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;//激活SE_SHUTDOWN_NAME这个权限
//提升权限//FALSE表示可以修改权限//把需要修改的权限传进来
if(!AdjustTokenPrivileges(hToken,FALSE,&tp,0,(PTOKEN_PRIVILEGES)nullptr,0))
break;
bRet = TRUE;
} while (FALSE);
if (hToken)
CloseHandle(hToken);
return bRet;
}
2.关机
//提权
AdjustPrivilege();
ExitWindowsEx(EWX_SHUTDOWN,0);
3.注销
//提权
AdjustPrivilege();
ExitWindowsEx(EWX_LOGOFF, 0);
4.重启
//提权
AdjustPrivilege();
ExitWindowsEx(EWX_REBOOT, 0);
5.还有很多的操作,只要对其进行提权就可以了.