隋麗娜,孟 偉
(河北民族師范學(xué)院 數(shù)學(xué)與計(jì)算機(jī)系,河北 承德 067000)
Microsoft公司的Windows操作系統(tǒng)是目前世界上應(yīng)用最廣泛的操作系統(tǒng),Visual Basic作為Microsoft旗下的一款編程語言在控制Windows系統(tǒng)工作時(shí)具有得天獨(dú)厚的優(yōu)勢(shì),可以通過Visual Basic實(shí)現(xiàn)對(duì)操作系統(tǒng)一些基本功能的處理及相關(guān)操作,如系統(tǒng)的啟動(dòng)、任務(wù)欄、桌面、控制面板等,為以后的相關(guān)開發(fā)積累經(jīng)驗(yàn)。本文主要利用VB語言的高級(jí)功能來實(shí)現(xiàn)關(guān)機(jī)、啟動(dòng)等控制,例如利用API函數(shù)實(shí)現(xiàn)計(jì)算機(jī)的關(guān)閉、注銷、重新啟動(dòng)控制功能,程序運(yùn)行界面如圖1所示。
圖1 關(guān)機(jī)、啟動(dòng)等控制
本例主要應(yīng)用API函數(shù)來實(shí)現(xiàn)計(jì)算機(jī)的關(guān)閉、啟動(dòng)等功能控制,用到的函數(shù)有:
*GetCurrentProcessID函數(shù),得到當(dāng)前進(jìn)程的ID;
*OpenProcessToken函數(shù),得到進(jìn)程的令牌句柄;
*LookupPrivilegeValue函數(shù),查詢進(jìn)程的權(quán)限;
*AdjustTokenPrivileges函數(shù),判斷令牌權(quán)限;ExitWindowsEx函數(shù),退出windows,并用特定的選項(xiàng)重新啟動(dòng)。
要對(duì)一個(gè)任意進(jìn)程(包括系統(tǒng)安全進(jìn)程和服務(wù)進(jìn)程)進(jìn)行指定了寫相關(guān)的訪問權(quán)的OpenProcess操作,需要當(dāng)前進(jìn)程具有SeDeDebug權(quán)限。如果一個(gè)用戶是Administrator或是被給予了相應(yīng)的權(quán)限,就可以具有該權(quán)限。但要注意:要修改一個(gè)進(jìn)程的訪問令牌,首先要獲得進(jìn)程訪問令牌的句柄,這可以通過OpenProcessToken得到,接著可以調(diào)用AdjustTokenPrivileges對(duì)這個(gè)訪問令牌進(jìn)行修改。
(1)創(chuàng)建一個(gè)項(xiàng)目,將其命名為Exam,默認(rèn)窗體為Form1,修改其標(biāo)題屬性為“關(guān)機(jī)、啟動(dòng)等控制”。
(2)從工具箱中向Form1窗體添加三個(gè)圖像框、三個(gè)標(biāo)簽和一個(gè)命令按鈕,如圖所示修改其相應(yīng)屬性。
(3)主要程序代碼:
在窗體的通用區(qū)聲明程序中應(yīng)到的所有API函數(shù),用Const關(guān)鍵字定義常量,并自定義結(jié)構(gòu)體LUID待用;在窗體的Load事件中,進(jìn)行一些初始化操作,并用語句AdjustTokenPrivileges hTokenHandle,False,tkpNew,Len(tkpPrevious),tkpPrevious,lBuffer-Needed允許當(dāng)前應(yīng)用程序有關(guān)閉操作系統(tǒng)權(quán)限;然后在圖像或文字的單擊事件中分別調(diào)用API函數(shù)實(shí)現(xiàn)相應(yīng)功能,如用ExitWindowsEx EWX_FORCE Or EWX_SHUTDOWN,0語句關(guān)閉計(jì)算機(jī),用ExitWindowsEx EWX_LOGOFF,0語句注銷計(jì)算機(jī),用ExitWindowsEx EWX_REBOOT,0語句重新啟動(dòng)計(jì)算機(jī)等。
實(shí)例的難點(diǎn)是對(duì)實(shí)現(xiàn)對(duì)計(jì)算機(jī)的關(guān)機(jī)等啟動(dòng)控制的相關(guān)API函數(shù)的理解,雖然有的函數(shù)名字本身比較直觀易于理解,但函數(shù)的實(shí)際應(yīng)用中經(jīng)常用到很多的參數(shù)是不容易理解的。參數(shù)中有時(shí)直接用VB常量表示,有時(shí)是用十六進(jìn)制數(shù)值表示,這樣一來,在讀程序時(shí)就比較難于理解,當(dāng)然也就難于被記牢。如有需要可多多查閱API函數(shù)的相關(guān)資料來獲得有用的信息。