windows下的關機函式是exitwindowex, 函式原型為:
bool winapi exitwindow***(
__in uint uflags,
__in dword dwreason
)
功能上有「關閉系統」,「登出使用者」,「鎖定工作站」3中操作。在windows nt核心的作業系統中,程序需要擁有se_shutdown_name許可權才能成功呼叫此函式。
程序的許可權記錄在程序的令牌當中,程序的令牌是一種核心物件,它儲存了使用者的安全配置資訊,例如使用者的sid、組的uid以及各種許可權等,令牌也記錄乙個已登入會話的引用和核心使用的預設安全設定。程序的令牌在程序被建立時產生,繼承于父程序。下面來看如何是區別當前作業系統版本,以及使本程序擁有se_shutdown_name許可權。
windows的系統的版本資訊使用乙個結構體osversioninfo表示,定義如下:
typedef struct _osversioninfo osversioninfo;
獲取系統的版本資訊的函式是getversionex, 函式原型為:
bool getversionex(
lposversioninfo lpversioninformation // 指向儲存獲得資訊的結構體
)
現在,我們已經知道關機程式的大體流程如下:
...osversioninfo verinfo;
verinfo.dwosversioninfosize = sizeof(osversioninfo);
if(getversionex(&verinfo) == 0)
if(verinfo.dwplatformid == ver_platform_win32_nt)
exitwindow***(ewx_force, 0); //關機
下面來看獲得許可權一部分。要使程序的許可權改變,就是改變他的令牌的屬性。首先,得獲取現有程序的令牌,使用函式openprocesstoken, 他的原型如下:
bool winapi openprocesstoken(
__in handle processhandle, //程序的控制代碼
__in dword desiredaccess, //令牌的訪問許可權
__out phandle tokenhandle //儲存獲得的令牌的指標
)
本程序的控制代碼可以用函式getcurrentprocess()函式得到。要使程序擁有se_shutdown_name許可權,實際上就是使該程序的令牌擁有該許可權對應的luid值。獲得某個許可權對應的luid值可以使用函式lookupprivilegevalue,原型如下:
bool winapi lookupprivilegevalue(
__in_opt lpctstr lpsystemname, //系統名,本系統為null
__in lpctstr lpname, //許可權名
__out pluid lpluid //獲得的luid
)
知道了這些之後,將程序的令牌對照進行調整,程序便擁有我們想要的許可權了,這裡用到函式adjusttokenprivileges,原型如下:
bool winapi adjusttokenprivileges(
__in handle tokenhandle, //要更改的令牌
__in bool disableallprivileges,
__in_opt ptoken_privileges newstate,
__in dword bufferlength,
__out_opt ptoken_privileges previousstate, //用以在更改後儲存先前的令牌
__out_opt pdword returnlength
)
現在我們也知道了獲得se_shutdown_name許可權的大體流程:
handle token;
token_privileges tp;
if(!openprocesstoken(getcurrentprocess(), token_adjust_privileges | token_query, &token) )
總程式如下:
#include
#include
int main()
if(verinfo.dwplatformid == ver_platform_win32_nt)
}exitwindow***(ewx_force, 0);
return 0;
}
MFC 獲得關機訊息 阻止Windows關機
wm queryendsession訊息是windows向你詢問windows能否關閉,wm endsession訊息表示提示你windows即將關閉。故當應用程式退出時,wm queryendsession訊息和wm endsession訊息均不響應。也就是說也就是說,你的程式在執行狀態時,而系統...
xp定時關機軟體 電腦小技巧,這樣關機更顯你實力!
有一些軟體在執行某些任務的時候,有乙個選項 執行完後自動關機 但是有些軟體並沒有這樣的功能,如果你想睡覺,可是又不想立即關閉電腦的時候,該怎麼辦,例如看片的時候,看著看著睡著了.看片睡著了 下面釋放大招的時刻到了,本人親測,xp到win10通用!首先,按下windows鍵 r,開啟執行對話方塊,就是...
MFC發布小軟體的注意事項
如果是debug版發布,常會出現 沒有找到mfc42d.dll,因此這個應用程式未能啟動.重新安裝應用程式可能會修復此問題 解決方法說明 一般在程式設計序時,都是生成了除錯版的程式,就是在那個 debug目錄下的可執行檔案。執行這除錯版的exe檔案,都會動態連線mfc42d.dll和msvcrtd....