◆王大權
基于AutoIt開發(fā)內(nèi)網(wǎng)系統(tǒng)補丁更新應用
◆王大權
(大慶油田有限責任公司第二油廠第七作業(yè)區(qū)技術管理室 黑龍江 163000)
文章對利用AutoIt V3腳本語言開發(fā)系統(tǒng)補丁自動下載與自動更新的主要步驟進行了分析,并闡明了用該語言開發(fā)的工具體積小、免安裝、占用系統(tǒng)資源低,適用于網(wǎng)絡環(huán)境一般、規(guī)模小的局域網(wǎng)進行系統(tǒng)補丁更新管理。
系統(tǒng)補??;AutoIt;正則表達式
WSUS和SMS是內(nèi)網(wǎng)中常用的補丁管理系統(tǒng),它們通過中心服務器來滿足內(nèi)網(wǎng)終端對系統(tǒng)補丁管理的需求,對于大規(guī)模甚至是跨區(qū)域的內(nèi)網(wǎng),可通過逐級建立級聯(lián)子服務器的方式來滿足計算機對補丁管理的需求。對于規(guī)模較大局域網(wǎng)(以下簡稱內(nèi)網(wǎng))中的某些子網(wǎng),它們遠離上一級網(wǎng)絡,存在因天氣、施工、設備故障或管理等原因,造成子網(wǎng)暫時與周邊網(wǎng)絡不能通訊的問題,這直接影響到這些子網(wǎng)內(nèi)的計算機對補丁更新管理的需求。此外,這些子網(wǎng)內(nèi)一些分公司、前線小隊所使用的網(wǎng)絡,規(guī)模不大或網(wǎng)速一般,在使用上一級補丁服務器更新時,存在補丁更新不及時或打不上的可能,因此,在子網(wǎng)本地建立一個條件要求低、容易快速搭建、能快速實現(xiàn)補丁更新的工具,解決了上述問題,對現(xiàn)有的補丁管理方式也是一種補充。
AutoIt v3(以下簡稱AU3)是用以編寫并生成具有 BASIC 語言風格的腳本程序的免費軟件,適用于微軟公司W(wǎng)indows2000及以上系統(tǒng),支持Windows GUI,支持強大的字符串處理語言——正則表達式,擁有眾多功能強大的網(wǎng)絡應用函數(shù),用它開發(fā)的工具,體積小、免安裝且不會向系統(tǒng)目錄和注冊表寫入任何信息,能被編譯成.exe類型文件,因此,AU3語言適合用于局域網(wǎng)補丁工具的開發(fā)。
工具是一個客戶端軟件,與內(nèi)網(wǎng)中已建立的Web補丁頁面構成了主從式架構。在客戶端運行工具,通過將本地已打補丁信息與網(wǎng)站所提供的補丁信息名稱的KB部分對比,可以實現(xiàn)自動篩選出計算機尚未更新的補丁信息,在利用AU3提供的相關函數(shù)實現(xiàn)系統(tǒng)補丁自動下載與自動更新。
首先,利用微軟系統(tǒng)補丁文件名稱中的KB部分的唯一特性,通過AU3自帶函數(shù)EnumKey()、_WinAPI_RegOpenKey()、_WinAPI_RegQueryInfoKey()從客戶端計算機注冊表相關項中提取計算機已更新補丁列表。圖1顯示了整個過程。
圖1 工具提取計算機已更新補丁列表
以上代碼實現(xiàn)了對計算機已更新補丁列表的提取。其中在枚舉
Uninstall分支過程中,應注意該分支下的信息不完全是補丁的KB信息,通過正則表達式“.*?(KBd+)[^d]*?.*','$1”加上宏@extended的條件判斷來準確提取出補丁KB信息。對Updates分支下的多層子項枚舉過程中,RegEnumKey()函數(shù)會漏掉部分KB信息,改用WINAPIex.AU3的子函數(shù)_WinAPI_RegOpenKey()和_WinAPI_RegQueryInfoKey()對其進行深層遞歸枚舉后,實現(xiàn)了對該分支的KB序列的精確提取。最后,將已更新補丁KB信息寫入到FixedList.ini中。
利用函數(shù)_IECreate()、_IELinkGetCollection()獲取WEB頁面補丁鏈接地址信息并利用StringSplit()提取其中的KB部分,與FixedList.ini文件中的KB信息進行比較,篩選出的不同KB信息的文件就是計算機尚未更新補丁列表信息,并將這些信息寫入到NewList.ini文件內(nèi)。過程如下:
If @OSVersion = "WIN_2003" Then
$oIE = _IECreate("http://補丁頁面.htm")
Else
…
EndIf
$oLinks = _IELinkGetCollection($oIE)
$iNumLinks = @extended
Func _GetLinkKB()
For $oLink In $oLinks
$file = StringSplit($oLink.href,"/",1)
$filekb = StringSplit($file[6],"-",1)
If IniRead("FixedList.ini","已經(jīng)安裝的補丁",$filekb[2],"") = "" Then
IniWrite("NewList.ini","未安裝補丁",$j,$oLink.href)
EndIf
$j += 1
Next
EndFunc
通過IniReadSection()函數(shù)讀取NewList.ini文件中的補丁文件鏈接地址信息,使用InetGet()函數(shù)完成補丁文件的批量下載并將下載文件保存在工具文件所在目錄下的Update子目錄下。
Func _DownLoad()
$var = IniReadSection("NewList.ini","未安裝補丁")
If @error Then
MsgBox(4096,"","讀NewList.ini文件出錯")
Else
For $i = 1 To $var[0][0]
$file = StringSplit($var[$i][1],"/",1)
$down = InetGet($var[$i][1],$Update & "" & $file[6],1,1)
Do
Sleep(250)
Until InetGetInfo($down,2)
InetClose($down)
Next
EndIf
EndFunc
使用_FileListToArray()函數(shù)從Update目錄下逐一讀取補丁文件,使用RunWait()函數(shù)實現(xiàn)補丁一鍵修復。
Func _OneKeyFixed()
Dim $filelist[1]
$filelist = _FileListToArray($Update,"*.exe",1)
If IsArray($filelist)= 0 Then
_Exit()
Else
For $j = 1 To $filelist[0]
$result = RunWait(@ScriptDir & "Update" & $filelist[$j] & " /u /z /n /o /q");
Next
EndIf
EndFunc
工具實現(xiàn)了廠內(nèi)網(wǎng)安裝WinXP、Win2003操作系統(tǒng)的終端計算機自動快速的系統(tǒng)補丁更新需要。
作為一名基層系統(tǒng)運維人員,完全依賴于網(wǎng)絡上提供的免費工具,進行系統(tǒng)清理與優(yōu)化、系統(tǒng)恢復或打補丁等這些日常工作,可能會給計算機帶來潛在安全風險威脅,也可能會影響到內(nèi)網(wǎng)已部署的安全工具的正常使用。因此,自主開發(fā)一些實用系統(tǒng)運維工具,是有實際意義的。AU3作為一種小眾語言,它功能強大,易于快速開發(fā)出眾多實用系統(tǒng)運維工具,非常適合從事系統(tǒng)與網(wǎng)絡管理人員來學習,在此拋磚引玉,希望能吸引更多的人來關注和學習AU3語言,為不斷提高系統(tǒng)運維水平和幫助用戶輕松、簡單的管理自己的計算機作出貢獻。
[1]“科普中國”科學百科詞條編寫與應用工作項目.系統(tǒng)漏洞[OL].https://baike.baidu.com,2018-02-12.
[2]AutoIt快速開發(fā)指南[EB].https://www.autoitx.com,2019-07-01.
[3]鄒國奎.基于AutoIt開發(fā)的局域網(wǎng)系統(tǒng)補丁更新應用[J].硅谷,2012(03):14.