(原创:新浪博客-玫瑰书城,是我的博客)
一个普通的程序是没有激活关机权限的,需要获得令牌才可以调用ExitWindowsEx进行关机。
代码如下:
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(
GetCurrentProcess(), //获得当前进程的句柄
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, //可查询并修改权限
&hToken //进程访问令牌的句柄传递给hToken
);
//先查看系统上SE_SHUTDOWN_NAME权限名的标识符(LUID),返回一个唯一的LUID标识符。
LookupPrivilegeValue(
NULL, //计算机名,NULL表示指定本地系统
SE_SHUTDOWN_NAME, //权限名称,表示允许关机
&tkp.Privileges[0].Luid //给函数传递LUID结构指针,给LUID传
);
tkp.PrivilegeCount = 1; //设置一个权限,只访问修改一个权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //说明权限是激活的
//令牌hToken的权限修改为可以关机(SE_SHUTDOWN_NAME)。
AdjustTokenPrivileges(
hToken, //令牌句柄
FALSE, //表示要修改权限
&tkp, //TOKEN_PRIVILEGES结构
0, //第五个参数(NULL)这的字节数,为0
(PTOKEN_PRIVILEGES)NULL, //存放修改前的访问权限信息,为空
0 //返回第五个参数字节数的DWORD变量指针
);
//ExitWindowsEx(EWX_LOGOFF,0); //注销
ExitWindowsEx(EWX_REBOOT,2); //重启
//ExitWindowsEx(EWX_SHUTDOWN,1); //关机