Verwenden von WMI zum Ermitteln des Installationsstatus von Windows-Updates
Zusammenfassung
Verwenden Sie WMI, um nach Updates (in KB) zu suchen, die unter dem derzeit verwendeten Windows installiert sind.
Betriebsumgebung
Umgebung für die Betriebsprüfung
Windows-Version |
|
.NET Framework-Version |
|
Systemvoraussetzungen erforderlich
Windows-Version |
|
.NET Framework-Version |
|
Substanz
Was ist 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.
- Windows-Verwaltungsinstrumentation (aus Wikipedia)
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.
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.
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
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".ManagementObjectCollection
ManagementObject
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.