Verwenden von WMI zum Ermitteln des Installationsstatus von Windows-Updates

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Zusammenfassung

Verwenden Sie WMI, um nach Updates (in KB) zu suchen, die unter dem derzeit verwendeten Windows installiert sind.

KB がインストールされている番号の一覧を表示しています。

Betriebsumgebung

Umgebung für die Betriebsprüfung

Windows-Version
  • Windows 7 Ultimate
  • Windows Vista Business
.NET Framework-Version
  • 3,5 SP1
  • 4

Systemvoraussetzungen erforderlich

Windows-Version
  • Windows 98 oder höher (aber nicht alle bestätigt)
.NET Framework-Version
  • 1.0
  • 1.1
  • 2.0
  • 3.0
  • 3.5
  • 4.0

Substanz

Was ist KB?

インストールされている更新プログラム(KB)が表示されています。

KB wird auch als Abkürzung für den Ausdruck "Kilobyte" oder "Tastatur" verwendet, daher glaube ich nicht, dass es ein Wort ist, das für die breite Öffentlichkeit verwendet wird, aber Updates wie Windows-Sicherheitsunterstützung und Fehlerbehebungen werden manchmal nach den ersten beiden Buchstaben der ID als "KB" bezeichnet.

Jedem dieser Updates wird eine ID zugewiesen und im Format "KBXXXXXXX" angegeben, wobei XXXXXX eine beliebige Nummer ist. Die Anzahl der Ziffern ist nicht festgelegt). Beachten Sie jedoch, dass nicht alle Updates diesem Format folgen.

Der ursprüngliche Name dieser "KB" lautet übrigens "Microsoft Knowledge Base" und stimmt mit der ID des von Microsoft im Web veröffentlichten technischen Artikels überein. Wenn es sich beispielsweise um ein Update für KB980218 handelt, lautet der entsprechende technische Artikel http://support.microsoft.com/?kbid=980218".

Programme, die nach dem KB-Installationsstatus suchen

Obwohl die Beispiele in Visual Studio 2010 und WPF beschrieben werden, können KB-Prüfprogramme auch in früheren Visual Studio-, Windows Form- und Konsolen-Apps verwendet werden. In diesem Artikel verwenden wir die Windows-Verwaltungsinstrumentation (Windows Management Instrumentation, WMI), um die KB-Installation zu überprüfen.

Hinzufügen von Verweisen

「参照設定」を右クリックして「参照の追加」を選択

Um WMI zu verwenden, verwenden Sie die ManagementObjectSearcher-Klasse und die ManagementObject-Klasse, aber Sie müssen auf System.Management .dll verweisen, um diese Klassen zu verwenden.

Klicken Sie für C#-Projekte im Projektmappen-Explorer mit der rechten Maustaste auf Verweise, und wählen Sie Verweise hinzufügen aus.

参照の追加ダイアログで System.Management を選択して追加しています

Wenn das Dialogfeld Verweis hinzufügen angezeigt wird, klicken Sie auf ". Wählen Sie auf der Registerkarte NET die Option System.Management aus, und klicken Sie auf die Schaltfläche OK.

OK, wenn der Projektmappen-Explorer-Referenz "System.Management" hinzugefügt wird.

VB.NET のプロジェクトのプロパティから System.Management の参照を追加しています

Wenn VB.NET die Projekteigenschaften öffnen, klicken Sie auf der Registerkarte auf der linken Seite auf "Durchsuchen" und rechts auf die Schaltfläche Hinzufügen. Wie oben wird das Dialogfeld "Verweis hinzufügen" angezeigt, wählen Sie "System.Management" und klicken Sie auf die Schaltfläche OK.

Wenn Sie zum vorherigen Bildschirm zurückkehren und "System.Management" zur mittleren Liste hinzufügen, ist dies in Ordnung.

Überprüfen Sie auch "System.Management" aus der Liste unten, um Namespacebeschreibungen in Ihrem Programm wegzulassen.

Obwohl es nicht mit den ursprünglichen Tipps zusammenhängt, verwendet dieses Beispiel die StringBuilder-Klasse, daher habe ich auch den "System.Text" -Namespace überprüft. (nur VB.NET)

Szene

KB チェック実行ボタンと検索結果一覧を表示するためのテキストボックスを配置

Der in diesem Beispiel verwendete Bildschirm ist ein einfacher Bildschirm mit einer Ausführungsschaltfläche zum Überprüfen des Installationsstatus der KB und einem Textfeld, in dem die Ergebnisse angezeigt werden.

Ich mache es in WPF, aber derselbe Bildschirm ist in Windows Form konfigurierbar.

Programm

C ManagementObjectSearcher # fügt ""using System.Management; am Anfang des Codes hinzu, um die Beschreibung von Klassen und anderen Namespaces zu reduzieren. In VB.NET haben Sie angegeben, dass der Namespace in die Projekteigenschaften importiert werden soll, sodass Sie nichts Besonderes schreiben müssen, aber wenn Sie dies nicht getan haben, müssen Sie ".Imports System.Management

* Wenn sowohl in C# als auch in VB.NET alle Klassennamen aus einem Namespace wie ""System.Management.ManagementObjectSearcher geschrieben werden, ist die obige Spezifikation nicht erforderlich.

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」追加)

Unten sehen Sie den Code, der die installierte KB durchsucht und auflistet.

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()

Das ""ResultTextBox in der ersten Zeile ist ein Textfeld zur Anzeige der erhaltenen Ergebnisse.

erstelltnew ManagementObjectSearcher eine Instanz der Suchklasse des verwalteten Objekts und legt die WMI-Abfrage als Argument fest. Die Syntax einer Abfrage ist fast gleich einer SQL-Anweisung, also schauen Sie sie sich in Bezug auf SQL für Details an. "Win32_QuickFixEngineering" steht für ein Update, das für das aktuelle Betriebssystem gilt.

Führt eine Suche in der WMI-Abfrage durch, die zuvor in " angegeben wurde, und gibt die Ergebnisse als "query.Get() zurück.ManagementObjectCollection

Da "" die Update-Informationen auflistet, erhalten wir "" in foreach und schreiben als Ergebnis einen eindeutigen Bezeichner aus dem Parameter "HotFixID".ManagementObjectCollectionManagementObject

作成されたフォルダ

Wenn Sie dies tun, werden die Update-IDs wie in der Abbildung dargestellt aufgelistet.

Wie Sie sehen können, wenn Sie es ausführen, ist es nur beim ersten Lauf langsam. Nach dem zweiten Mal ist es noch recht früh.

Es ist nicht klar, ob System.Management.dll langsam geladen und verarbeitet wird, oder die Ausführung von WMI-Abfragen langsam ist, aber die Tatsache, dass es langsam ist, ändert sich nicht, wenn Sie sich also Sorgen um die Latenz bei der Verwendung machen, denke ich, dass es notwendig ist, Maßnahmen wie die asynchrone Ausführung zu ergreifen.