摘要:該文主要介紹了如何配置用于計算機等級考試的學生機,用Autoit語言實現模擬手動修改考試用戶名,簡單介紹了應用WMI服務命令和調用NetUserSetInfo API函數實現全自動修改考試用戶名,從而提高配置大量考試用機的工作效率和準確性。
關鍵詞:Autoit;WMI;API
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2010)03-632-02
Autoit Realization the Calculator Grade Examination Modification User's Name
CHEN Xi
(Minjiang University, Fuzhou 350000, China)
Abstract: This text introduce how move the modification examination user's name with the Autoit language hand, introduce the applied WMI service order with adjust to carry out a full-automatic modification with the function of NetUserSetInfo API, raise the work efficiency and accuracy thus.
Key words: Autoit; WMI; API
自從計算機等級考試操作系統環境要求為Windows以來,考試學生機要求每臺機器名按順序編排(例如compt01、compt02、compt03……),并且Windows的登錄用戶名的順序號要與機器名相一致(例如ks01、ks02、ks03……)。現在學生機基本上配有硬盤還原卡,大多數還原卡所帶的驅動可以自動有序修改機器名,但是不能實現自動有序設置修改用戶名,如果是幾百臺計算機要人工手動修改計算機名的話,工作量是非常復雜、而且容易出錯,不利于學生考試。
因些要想自動、準確地配置好考試登錄用戶名,有兩種方案,第一種是每臺機從樣機同步復制系統后,刪除舊的用戶名,另外新建與計算機序號相同的用戶名;第二種是直接修改原用戶名,改成與計算機序號相同的用戶名。第一種方案,會出現新建立的用戶配置文件與樣機原用戶配置文件不同,會造成映射盤符不同、輸入法不同、用戶界面快捷方式等不同,與樣機調試好的考試環境有較大出入,而第二種方案完全保持樣機原用戶配置文件,與樣機調試好的考試環境完全相同,所以選擇第二種方案。
1 AutoIt 語言實現模擬手動修改用戶名
要實現第二種方案,可以考慮先從最簡單的模擬手動操作鍵盤、鼠標修改用戶名出發,而AutoIt語言是用以編寫并生成具有 BASIC 語言風格的腳本程序語言,它被設計用來在Windows GUI(用戶界面)中進行自動操作. 通過它可以組合使用模擬鍵擊,鼠標移動和窗口/控件操作等來實現自動化任務,而這是其它語言所無法做到或尚無可靠方法實現的, AutoIt 非常小巧,完全可以運行在目前流行的Windows操作系統上 , 并且不需要任何運行庫。
模擬手動修改用戶名的程序設計主要思路如下:先獲取機器名(例如compt02),截取機器名的后面兩位序號(例如02),再定義新修改的用戶名變量(例如 ks+序號02),通過調用計算機管理程序,再模擬鍵盤操作找到樣機原用戶名(例如ks01),再模擬鍵盤輸入新修改的用戶名(例如 ks02)。
程序主要代碼如下:
dim $str=@ComputerName; 獲取機器名
;Dim $var = \"ks\"StringRight($str,2); 取變量var為\"ks\"+機器名后兩位
$var = inputbox(\"用戶名修改為\",\"把當前用戶名修改為:\",@UserName); 輸入新修改的用戶名
BlockInput(1); 禁止用戶按鍵盤、鼠標,防止誤操作
Run(\"mmc%windir%\\system32\\compmgmt.msc\",@TempDir); 調用計算機管理程序
WinWait(\"計算機管理\"); 等待計算機管理程序窗口激活
Send(\"{DOWN 4}\"); 模擬鍵盤向下操作4次
Send(\"{RIGHT}\"); 模擬鍵盤向右操作1次
……
send($var); 模擬鍵盤輸入新修改的用戶名
……
WinClose (\"計算機管理\"); 關閉計算機管理程序
BlockInput(0); 恢復用戶按鍵盤、鼠標
模擬手動程序優點是比較直觀,讓用戶了解操作的每一步驟,但是缺點是實效性慢,因為新舊機器速度運行不一樣,延時快慢不好精確設置,另外,一些新的還原卡驅動(如增霸卡新驅動V2.3版)在樣機傳送完畢后,在更新計算機名時是會關閉鍵盤修改計算機用戶名的操作,所以這個程序比較適合考試過程中個別機器出現故障,需要換另外備用機器而臨時修改用戶名使用。
2 使用WMI服務命令自動修改用戶名
WMI是英文Windows Management Instrumentation的簡寫,WMI以CIMOM為基礎,CIMOM即公共信息模型對象管理器(Common Information Model Object Manager),是一個描述操作系統構成單元的對象數據庫,為MMC和腳本程序提供了一個訪問操作系統構成單元的公共接口。
有了WMI,工具軟件和腳本程序訪問操作系統的不同部分時不需要使用不同的API,工具軟件和WMI可以方便地讀寫WMI。它的功能主要是:訪問本地主機的一些信息和服務,可以方便地管理本地和遠程計算機。
目前主流的Windows都支持WMI,需要在計算機上安裝 WMI服務并啟動服務后,才能使用該命名空間中的管理功能。使用Autoit腳本編寫的程序,需要先判斷系統是否存在WMI服務,如果所需的服務名稱winmgmt不存在,則需要從 MSDN 下載并安裝 WMI,再啟動服務Winmgmt。
程序主要代碼如下:
; 設置服務winmgmt自動啟動
RunWait(@ComSpec ' /c sc config winmgmt start= auto', @SystemDir, @SW_HIDE)
; 啟動服務winmgmt
RunWait(@ComSpec ' /c sc start winmgmt', @SystemDir, @SW_HIDE)
;先修改用戶全名,注銷登錄界面顯示的是用戶全名,把樣機原用戶全名“考試ks01”修改為“考試ks”序號
RunWait(@COMSPEC \" /c WMIc useraccount where fullname='考試ks01' set fullname=考試ks%computername:~-2%\")
; 修改用戶名, 把樣機原用戶名“ks01”修改為“ks”序號
RunWait(@COMSPEC \" /c WMIc useraccount where name='ks01' call rename name=ks%computername:~-2%\")
使用WMI服務命令自動修改用戶名簡單方便,但是需要安裝并啟動WMI服務。
3 調用了Netapi32.dll中的NetUserSetInfo API函數自動修改用戶名
API的英文全稱(Application Programming Interface),WIN32 API也就是MicrosoftWindows32位平臺的應用程序編程接口。我們還可以調用Netapi32.dll中的NetUserSetInfo API函數,這個API函數很強大,可以設置用戶名或全名、密碼、用戶配置文件等,設置用戶的各種信息最終都會調用到這個API。
可以先定義函數使用NetUserSetInfo,例如:
Func _LsaLocalUserSetInfo($sUserName, $iLevel, $pBuffer, $sBufferType = \"ptr\", $sSystem = \"\")
Local $iResult
$iResult = DllCall(\"Netapi32.dll\", \"long\", \"NetUserSetInfo\", \"wstr\", $sSystem, _
\"wstr\", $sUserName, \"dword\", $iLevel, _
$sBufferType, $pBuffer, \"dword*\", 0)
Return SetError($iResult[0], 0, $iResult[0] = 0)
EndFunc
; 先改全名,找到用戶名\"ks01\",用戶全名修改為“考試ks”序號
_LsaLocalUserSetInfo(\"ks01\", 1011, '考試ks' StringRight(@ComputerName,2) , \"wstr*\")
; 再改用戶名,找到用戶名\"ks01\",用戶名修改為“ks”序號
_LsaLocalUserSetInfo(\"ks01\", 0, \"ks\" StringRight(@ComputerName,2), \"wstr*\")
4 結束語
以上是針對不同情況,采用Autoit腳本語言按計算機等級考試要求進行修改Windows登錄用戶名的幾種實現方法,可以大大地方便機房配置教學和考試用機,提高工作效率,本人程序拋磚引玉,需要不斷進行完善,請專家指正。
參考文獻:
[1] 王春海.非常網管——Windows腳本應用詳解[M].北京:人民郵電出版社,2008.
[2] 范文慶,周彬彬,安靖.精通Windows API:函數、接口、編程實例[M].北京:人民郵電出版社,2009.
[3] 冉林倉 Windows API編程[M].北京:清華大學出版社,2005.
[4] Policht M.WMI技術指南[M].北京:機械工業出版社,2002.
[5] NetUserSetInfo Function[EB/OL].http://msdn.microsoft.com/en-us/library/aa370659(VS.85).aspx.
[6] AUTOIT CN 論壇[EB/OL].http://www.autoit.net.cn/index.php.