最近我在寫一個程式的時候,需要用到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;
}
誒,由此可見程式本身的編寫是容易的,在菜鳥階段(就像我),我覺得一些莫名其妙的錯誤是可怕的,因為你沒有經驗,所以錯誤修正就比較難。先寫這麼多吧,望各位菜鳥好自為之。