Share via


嗨,Scripting Guy!

Hey,Scripting Guy!

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

今天的問題:要怎樣才能知道電腦上安裝了哪些 Service Pack 呢?


要怎樣才能知道電腦上安裝了哪些 Service Pack 呢?

嗨,Scripting Guy!要怎樣才能知道電腦上安裝了哪些 Service Pack 呢?

-- FR

FR,您好。這真是大哉問啊!您一定比我們更了解,在今天這個環境裡,最重要的就是要確定您的所有電腦都安裝了來自 Windows Update 的最新 Service Pack、最新的問題修正,以及最新的下載程式。不過,就像您所說的,要怎麼做呢?

這個嘛,您可比我們進步多了:沒錯,指令處理是追蹤此資訊的一種好方法。例如,這個簡單的指令可報告電腦上安裝的最新 Service Pack:

strComputer = "."
Set objWMIService = GetObject("winmgmts:"_ 
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colOperatingSystems = objWMIService.ExecQuery _ 
  ("Select * from Win32_OperatingSystem") 
For Each objOperatingSystem in colOperatingSystems 
  Wscript.Echo objOperatingSystem.ServicePackMajorVersion  _ 
    & "." & objOperatingSystem.ServicePackMinorVersion 
Next

現在您一定在想:「這裡說的是『最新』的 Service Pack。但是我想知道的是電腦上安裝的『所有』Service Pack 啊!」如果是這樣的話,請放心;舉例來說,當您安裝 Service Pack 3.0 時,就會自動取得 Service Pack 1.0 及 2.0 所包括的所有項目。因此,是否安裝 Service Pack 1.0 並不重要;安裝 Service Pack 3.0 就可以取得 Service Pack 1.0 的所有功能。也就是說,您真正需要注意的是電腦最後安裝的 Service Pack。上述指令碼就可以完成此動作。

但是,剛才提到的那些問題修正呢?要如何稽核電腦以得知安裝了哪些問題修正呢?請試試這個指令碼:

strComputer = "."
Set objWMIService = GetObject("winmgmts:"_ 
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colQuickFixes = objWMIService.ExecQuery _ 
  ("Select * from Win32_QuickFixEngineering") 
For Each objQuickFix in colQuickFixes 
  Wscript.Echo "Computer:" & objQuickFix.CSName 
  Wscript.Echo "Description:" & objQuickFix.Description 
  Wscript.Echo "Hot Fix ID:" & objQuickFix.HotFixID 
  Wscript.Echo "Installation Date:" & objQuickFix.InstallDate 
  Wscript.Echo "Installed By:" & objQuickFix.InstalledBy 
Next

請記住兩件事:首先,問題修正並不是都以標準方式來發行。這並不表示它們無法運作;只是表示部份問題修正可能不會匯入上述所有欄位;例如,許多問題修正都不會傳回 InstallDate 屬性的值。其次,問題修正的資訊是記錄於電腦的不同位置,而且因為這個動作並沒有一種標準方法來進行,所以 WMI 會檢查所有這些位置並擷取問題修正的資訊。這樣很好,只是問題修正有時會將資訊實際記錄於多個位置。這算不上什麼大問題;只是表示當您從 WMI 取回資訊時,可能會看到問題修正 QFE 1111111 出現了兩三次。這是因為 QFE 1111111 將它自己的資訊記錄在數個不同的位置。

沒錯:我們還是提到了 Windows Update,不是嗎?如果您安裝了最新版本的 Windows Update,就會有個新的 COM 物件可讓您擷取更新資訊。例如:

Set objSession = CreateObject("Microsoft.Update.Session") 
Set objSearcher = objSession.CreateUpdateSearcher 
intHistoryCount = objSearcher.GetTotalHistoryCount 
'Wscript.Echo intHistoryCount
Set colHistory = objSearcher.QueryHistory(1, intHistoryCount)
For Each objEntry in colHistory 
  Wscript.Echo "Operation:" & objEntry.Operation 
  Wscript.Echo "Result code:" & objEntry.ResultCode 
  Wscript.Echo "Date:" & objEntry.Date 
  Wscript.Echo "Title:" & objEntry.Title 
  Wscript.Echo "Description:" & objEntry.Description 
  Wscript.Echo "Client application ID:" & objEntry.ClientApplicationID 
  Wscript.Echo "Server selection:" & objEntry.ServerSelection 
  Wscript.Echo "Service ID:" & objEntry.ServiceID 
  i = 1 
  For Each strStep in objEntry.UninstallationSteps 
    Wscript.Echo i & " -- " & strStep 
    i = i + 1 
  Next 
  Wscript.Echo "Uninstallation notes:" & objEntry.UninstallationNotes 
  Wscript.Echo "Support URL:" & objEntry.SupportURL 
  Wscript.Echo 
Next

事實上;我們只能確定 Windows XP 會安裝 Microsoft.Update.Session 物件 (當您安裝 XP Service Pack 2 時,就會自動安裝)。如果您執行的是 Windows 2000,則可能需要造訪 Windows Update,安裝最新的版本,然後執行上述指令碼,看看它是否能夠運作。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首