WMI是Windows 2000/XP管理系統的核心;對於其它的Win32作業系統,WMI是一個有用的外掛程式。WMI以CIMOM為基礎,CIMOM即公用資訊模型對象管理器 (Common Information Model Object Manager),是一個描述作業系統構成單元的對象資料庫,為MMC和指令碼程式提供了一個訪問作業系統構成單元的公用介面。Windows 管理規範 (WMI) 是可伸縮的系統管理結構,它採用一個統一的、基於標準的、可擴充的物件導向介面。我在剛開始理解WMI的時候,總以為WMI是“Windows管理介面(Interface)”。
下面我們就詳細來瞭解如何利用WMI實現補丁的檢測過程。圖1是整個檢測過程的流程圖。
圖1.利用WMI實現補丁檢測之流程圖
第一步,設定需要檢測的補丁號。我們知道,微軟的每個補丁都會有一個標準的編號(如KB828741),對於最新的補丁,我們可以從微軟的網站上獲得。然後,將希望使用者安裝的補丁號放到一個數組裡。根據不同Windows作業系統我們需要設定不同檢測補丁號。基於當前Windows系統使用方式,我只對Windows 2000/2003/XP進行檢測。
圖1.利用WMI實現補丁檢測之流程圖
第一步,設定需要檢測的補丁號。我們知道,微軟的每個補丁都會有一個標準的編號(如KB828741),對於最新的補丁,我們可以從微軟的網站上獲得。然後,將希望使用者安裝的補丁號放到一個數組裡。根據不同Windows作業系統我們需要設定不同檢測補丁號。基於當前Windows系統使用方式,我只對Windows 2000/2003/XP進行檢測。
‘ 對於windows 2000
arrFixed_WIN2K=Array("KB840315","KB870669","KB828741","KB835732",
"KB840987","KB841356","KB885835","KB885836",
"KB842526","KB841872","KB841873","KB889293")
'對windows 2003系統
arrFixed_WIN2K3=Array("KB834707","KB840374","KB867801","KB833987",
"KB873376","KB885835","KB885836")
'對於windows xp SP1
arrFixed_XP1=Array("KB840987","KB833987","KB839645","KB840315","KB841873","
KB873376","KB841356","KB889293","KB885835","KB885836")
'對於windows xp SP2
arrFixed_XP2=Array("KB834707","KB885835","KB885836")
第二步,建立WMI對象,並和目標主機建立串連。
Dim objWMIService // WMI對象
Dim strComputer = “.” // 地址為當前主機
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
首先,定義兩個變數objWMIService和strComputer,第一個為我們要建立的服務定位對象,第二個為目標主機IP地址(如果為當前主機者為“.”)。第三句建立一個串連到目標主機的服務物件,定義名字空間參數為“root\cimv2”。在這個名字空間裡有我們接下來要用的系統資訊。
Socket:詳細代碼請看光碟片附送的Check_patch.txt,變更檔副檔名txt為VBS,在Windows下可雙擊運行,如果當前系統檢測出未打補丁,則出現提示視窗,否則無。
第三步,讀取目前使用者作業系統資訊,及其安裝補丁的情況。在名字空間“root/cimv2”下,執行個體“Win32_OperatingSystem”為我們提供了詳細的當前作業系統資訊。我們採用Wql(sql for WMI)來讀取該執行個體,熟悉SQL文法的朋友一看就知道是在做什麼了。
' 先判斷主機系統資訊:OS,SP補丁版本情況
' 擷取系統資訊
Dim objOSInfo // 擷取作業系統資訊
Dim intOSver,intOStype,intCurrentSP // 當前系統版本,類型,Service Pack號
Set objOSInfo = osvcRemote.ExecQuery("Select ServicePackMajorVersion,Version,OSType FROM Win32_OperatingSystem")
For Each colOSInfo In objOSInfo
intCurrentSP = colOSInfo.ServicePackMajorVersion ‘sp安全補丁版本
intOSver = colOSInfo.Version ‘作業系統版本號碼
intOStype = colOSInfo.OSType ‘作業系統類型
Next
Socket:如何知道要串連哪個名字空間,獲得哪些對象呢?《WMI技術指南》[3]中分類列出了大量常用的對象。可惜它沒有相應的電子書,你只有到書店裡找它了。你也可以用WMITools裡WMI CIM Studio這個工具的搜尋功能,很容易就能找想要的對象。找到對象後,WMI CIM Studio能列出其屬性和方法,然後到MSDN裡找具體的協助。
第四步,擷取當前系統已經安裝的補丁資訊。在“root\cimv2”下,執行個體“Win32_QuickFixEngineering”下的“HotFixID”屬性存放了當前系統所安裝的補丁資訊。
'*******************************************************************
'*讀取目標主機已安裝補丁列表到字串strFixedList
'*******************************************************************
Dim colQFE, objQFE
Dim strHotFixID, strFixedList, strFind, strNoFixed
Set colQFE = osvcRemote.ExecQuery("SELECT HotFixID FROM Win32_QuickFixEngineering")
第四步,將讀取的使用者補丁號存到一陣列變數,然後與我們在“第一步“定義的相應數組進行匹配,找出當前系統未安裝的補丁號。這部分的實現比較簡單,請參考後面的代碼。
第五步,顯示最後檢測結果。
至此,整個補丁檢測過程結束,只要將本指令檔進行點擊運行,就可以完成補丁的檢查。特別是對於已經在企業中建立起Acitve Directory域的網路系統管理員來說,只要將此指令碼添加到網域控制站的組策略裡,對每個登陸到域的使用者進行補丁檢測,提示使用者最新補丁資訊,再也不用為使用者沒有安裝最新補丁而苦惱了,大大提高了企業內部網路安全管理。