最近我在写一个程序的时候,需要用到ExitWindowsEx函数,使电脑重启,但是无论怎么使都是在vc6中可以运行,但是一旦生成了exe文件,就没有这种效果,于是乎上网找,上论坛上找,都没有结果。
于是我开始怀疑ExitWindowsEx函数,就改用shellexecute函数,任然不顶用,我勒个去,但是无意间看到一位大神说到了shell函数的延时问题,于是我在想是不是因为程序本省以外结束进程使得生成的exe文件本身有问题,就禁用了系统某些功能,进行调试,生成了我认为完整的exe文件,结果还是不行。按照那位大神的说法,我有为程序做了个延迟::Sleep(500);结果还是不如人意,这时候就比较郁闷了。
想了几天,终于回归到程序权限问题上来,上网查看了有关资料,猜测生成的exe文件独立于vc之外所以程序权限不一样,单独的控制台程序的权限不够使系统重启,关机,注销。于是乎提权成了当务之急。查了资料,写出了提权代码。代码如下:
BOOL Dshoutdown(void)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
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);
ExitWindowsEx(EWX_REBOOT,0);
return TRUE;
}
诶,由此可见程序本身的编写是容易的,在菜鸟阶段(就像我),我觉得一些莫名其妙的错误是可怕的,因为你没有经验,所以纠错就比较难。先写这么多吧,望各位菜鸟好自为之。