使用 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 查询,但这一事实并没有改变,因此,如果您担心等待时间使用,您可能需要异步执行。