嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何得知套用 Windows Update 最後一個補充程式的時間?


如何得知套用 Windows Update 最後一個補充程式的時間?

嗨,Scripting Guy!如何得知套用 Windows Update 最後一個補充程式的時間?

-- JP

JP,您好。這個問題提出的時機恰到好處。不久前我們發表的《指令碼物語》(Tales from the Script) 專欄中,曾向指令碼撰寫者介紹 Windows Update 物件模型,並提供一些範例指令碼來管理「自動更新」。雖然這篇文章並未提供如何使用指令碼傳回最後一次套用更新到電腦的資訊,不過解決方法很簡單:
Set objSession = CreateObject("Microsoft.Update.Session")
Set objSearcher = objSession.CreateUpdateSearcher
Set colHistory = objSearcher.QueryHistory(1, 1)
For Each objEntry in colHistory
    Wscript.Echo "Title: " & objEntry.Title
    Wscript.Echo "Update application date: " & objEntry.Date
Next

您可能正在疑惑,這一小段指令碼在講什麼呢?嘿嘿,待咱給您解說啦!我們開始先建立 Microsoft.Update.Session 物件的執行個體。建立此物件後,就可以呼叫 CreateUpdateSearcher 方法。我們可以藉此取得 Searcher 物件的執行個體,然後用這個物件來搜尋某台電腦套用的所有更新,這就是我們的目的。

接下來使用 QueryHistory 方法來擷取所需更新:

Set colHistory = objSearcher.QueryHistory(1, 1)

如您所見,在這段指令碼傳遞兩個參數給 QueryHistory:1 與 1。第一個 1 告訴指令碼要在更新歷程記錄中開始搜尋記錄 1,第二個 1 則告訴指令碼在記錄 1 後停止搜尋 (也就是開始搜尋記錄 2 之前)。為什麼要這麼做?這麼說好了,更新會以倒時順序儲存,最新更新為記錄 1,至於最初套用的第一個更新則是集合中的最後一筆記錄。由於只需要最近一次的更新資訊,我們可以限制指令碼只傳回該筆記錄資料,藉此節省一點時間。

注意:順便一題,擷取電腦的完整更新歷程記錄很容易,其實《指令碼物語》(Tales from the Script) 專欄就包含這個工作的指令碼。


呼叫 QueryHistory 方法後,我們會得到包含單一項目的集合 (稱為 colHistory),這個項目剛好就是電腦最後一次套用的更新。現在只需要瀏覽此集合 (沒錯,雖然只包含一個項目,還是算集合) 並回應更新標題以及套用更新的日期:

For Each objEntry in colHistory
    Wscript.Echo "Title: " & objEntry.Title
    Wscript.Echo "Update application date: " & objEntry.Date
Next

也就是說,告訴我們 Windows Update 最後一次對此特定電腦執行作業的時間。

附帶一提,Windows Update 物件模型的內容參雜不齊:有些物件可以在遠端電腦上建立及使用,有些則不行。幸好這段指令碼剛好可以對遠端機器執行。您只需要將遠端電腦名稱當作 CreateObject 的第二個參數加入即可。例如,這行程式碼可讓指令碼對遠端電腦 atl-dc-01 執行:

Set objSession = CreateObject("Microsoft.Update.Session", "atl-dc-01")

從 atl-dc-01 擷取最後一次更新的完整指令碼如下:

Set objSession = CreateObject("Microsoft.Update.Session", "atl-dc-01")
Set objSearcher = objSession.CreateUpdateSearcher

Set colHistory = objSearcher.QueryHistory(1, 1)

For Each objEntry in colHistory Wscript.Echo "Title: " & objEntry.Title Wscript.Echo "Update application date: " & objEntry.Date Next

還覺得補充程式管理很複雜嗎?小事一樁啦!


如需詳細資訊

請參閱嗨,Scripting Guy! - 過往文件

 

回到頁首 回到頁首