使用 WMI 檢查 Windows 更新的安裝狀態
概述
使用 WMI 檢查當前 Windows 上安裝的更新 (KB)。
操作環境
操作確認環境
視窗版本 |
|
.NET Framework 版本 |
|
必需操作環境
視窗版本 |
|
.NET Framework 版本 |
|
內容
什麼是 KB?
由於 KB 也用於“KB”或“鍵盤”等表達式的縮寫,因此它不是常用的單詞,但更新(如 Windows 安全回應和 Bug 修復)可以用 ID 的首字母縮寫來表示“KB”。
每個更新都有一個 ID,並以格式“ KBXXXXXX”指定(XXXXXX 是任何數位)。 位數不是固定的。 但是,請注意,並非所有更新都採用此格式。
順便說一下,此 KB 的最初名稱是“Microsoft 知識庫”,它與 Microsoft 在 Web 上發佈的技術文檔的 ID 匹配。例如,如果更新了 KB980218,則相應的技術文檔是 http://support.microsoft.com/?kbid=980218“。
查找 KB 安裝狀態的程式
該示例在 Visual Studio 2010 和 WPF 中進行了介紹,但 KB 檢查程式也可用於以前的 Visual 工作室、Windows 表單和控制台應用。 這一次,您將使用視窗管理集成 (WMI) 檢查 KB 的安裝狀態。
添加引用
若要使用 WMI,請使用管理物件搜尋器或管理物件類,但若要使用這些類,必須引用系統.管理.dll。
對於 C# 專案,請右鍵按兩下解決方案資源管理員中的“引用設置”,然後選擇“添加引用”。
當出現「添加引用」對話框時,將顯示」。 NET 選項卡,選擇系統管理,然後按下「確定」 按鈕。
如果「系統.管理」已添加到解決方案資源管理器中的引用設置中,則確定。
對於 VB.NET,打開項目屬性,從左側選項卡按下「流覽」,然後按下右側的“添加”按鈕。 將出現“添加引用”對話框,如上所示,選擇“系統.管理”,然後按兩下“確定”按鈕。
如果返回到上一螢幕並將「系統.管理」添加到中心清單中,則「確定」。。
此外,讓我們從下面的清單中選中「系統.管理」 ,以跳過程式中的命名空間描述。
此外,它與原始提示無關,但此示例使用字串生成器類,因此我們還檢查了“系統.Text”命名空間。 (僅限 VB.NET)
螢幕
此範例中使用的螢幕是一個簡單的螢幕,其中包含用於檢查 KB 安裝的運行按鈕和顯示結果的文字框。
我在 WPF 中構建了類似的螢幕,但您可以在 Windows 窗體中配置類似的螢幕。
程式
C# 在 ManagementObjectSearcher
代碼的開頭添加了“ ”using System.Management;
VB.NET 指定在專案屬性中導入命名空間,因此不需要編寫命名空間,但如果未匯入命名空間,Imports System.Management
則必須添加 。
*C# 和 VB.NET 如果從命名空間(如“System.Management.ManagementObjectSearcher
”)描述所有類名稱,則不需要上述規範。
C #
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Management; // 追加 (参照から「.NET」より「System.Management」追加)
下面是搜索和列出已安裝的 KB 的代碼。
C #
this.ResultTextBox.Text = "";
// WMI クエリをセットして管理オブジェクト検索クラスを作成
ManagementObjectSearcher query =
new ManagementObjectSearcher("Select * From Win32_QuickFixEngineering");
// WMI クエリを使用して管理オブジェクトコレクションを取得
ManagementObjectCollection queryCollection = query.Get();
StringBuilder builder = new StringBuilder();
// コレクションから管理オブジェクトを列挙する
// ここでは HotFixID を取得
foreach (ManagementObject mo in queryCollection)
{
builder.AppendLine(mo["HotFixID"].ToString());
}
// 取得した KB 一覧をセット
this.ResultTextBox.Text = builder.ToString();
VB.NET
Me.ResultTextBox.Text = ""
' WMI クエリをセットして管理オブジェクト検索クラスを作成
Dim query As ManagementObjectSearcher = _
New ManagementObjectSearcher("Select * From Win32_QuickFixEngineering")
' WMI クエリを使用して管理オブジェクトコレクションを取得
Dim queryCollection As ManagementObjectCollection = query.Get()
Dim builder As System.Text.StringBuilder = New System.Text.StringBuilder()
' コレクションから管理オブジェクトを列挙する
' ここでは HotFixID を取得
For Each mo As ManagementObject In queryCollection
builder.AppendLine(mo("HotFixID").ToString())
Next
' 取得した KB 一覧をセット
Me.ResultTextBox.Text = builder.ToString()
第一行中的“ResultTextBox
”是一個文本框,用於顯示檢索結果。
new ManagementObjectSearcher
創建託管物件的搜索類的實例,併為參數設置WMI查詢。 查詢的語法幾乎等於 SQL 語句,因此請查看 SQL 相關的詳細資訊。 Win32_QuickFixEngineering表示應用於當前操作系統的更新。
在前面query.Get()
指定的 WMI 查詢中搜索,並將ManagementObjectCollection
結果返回為”
由於“ManagementObjectCollection
”列出了更新資訊,因此 foreachManagementObject
獲取“”,並從“熱修復 ID”參數寫入唯一標識符。
這將列出更新的ID,如圖所示。
正如您所看到的,它僅在首次運行時運行,但速度很慢。 第二次和以後,它相當快。
System.Management .dll 載入,我不知道是緩慢運行還是緩慢運行 WMI 查詢,但這一事實並沒有改變,因此,如果您擔心等待時間使用,您可能需要異步執行。