Utilizzare WMI per determinare lo stato di installazione degli aggiornamenti di Windows

Pagina aggiornata :
Data di creazione della pagina :

sommario

Utilizzare WMI per verificare la disponibilità di aggiornamenti (in KB) installati in Windows attualmente in uso.

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

Ambiente operativo

Ambiente di controllo del funzionamento

Versione Windows
  • Windows 7 Ultimate
  • Windows Vista Business
Versione di .NET Framework
  • 3.5 SP1
  • 4

Requisiti di sistema richiesti

Versione Windows
  • Windows 98 o versione successiva (ma non tutti confermati)
Versione di .NET Framework
  • 1.0
  • 1.1
  • 2.0
  • 3.0
  • 3.5
  • 4.0

sostanza

Che cos'è KB?

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

KB è anche usato come abbreviazione per l'espressione "kilobyte" o "tastiera", quindi non penso che sia una parola usata per il pubblico in generale, ma aggiornamenti come il supporto di sicurezza di Windows e le correzioni di bug sono a volte indicati come "KB" dopo le prime due lettere dell'ID.

A ciascuno di questi aggiornamenti viene assegnato un ID e specificato nel formato "KBXXXXXXX" dove XXXXXX è un numero qualsiasi. Il numero di cifre non è fisso). Si noti, tuttavia, che non tutti gli aggiornamenti seguono questo formato.

A proposito, il nome originale di questa "KB" è "Microsoft Knowledge Base" e corrisponde all'ID dell'articolo tecnico pubblicato da Microsoft sul Web. Ad esempio, se si tratta di un aggiornamento a KB980218, l'articolo tecnico corrispondente è http://support.microsoft.com/?kbid=980218".

Programmi che cercano lo stato di installazione KB

Sebbene gli esempi siano descritti in Visual Studio 2010 e WPF, i programmi di controllo KB possono essere usati anche nelle app Visual Studio, Windows Form e console precedenti. In questo articolo verrà utilizzata Strumentazione gestione Windows (WMI) per verificare l'installazione KB.

Aggiunta di riferimenti

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

Per utilizzare WMI, è necessario utilizzare le classi ManagementObjectSearcher e ManagementObject, ma è necessario fare riferimento a System.Management .dll per utilizzare queste classi.

Per i progetti C#, fare clic con il pulsante destro del mouse su Riferimenti da Esplora soluzioni e scegliere Aggiungi riferimenti.

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

Quando viene visualizzata la finestra di dialogo Aggiungi riferimento, fare clic su ". Nella scheda NET selezionare System.Management e fare clic sul pulsante OK.

OK se "System.Management" viene aggiunto al riferimento di Esplora soluzioni.

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

Se VB.NET aprire le proprietà del progetto, fai clic su "Sfoglia" dalla scheda a sinistra, fai clic sul pulsante Aggiungi a destra. Come sopra, viene visualizzata la finestra di dialogo Aggiungi riferimento, quindi selezionare "System.Management" e fare clic sul pulsante OK.

Se si torna alla schermata precedente e si aggiunge "System.Management" all'elenco centrale, è OK.

Inoltre, selezionare "System.Management" dall'elenco seguente per omettere le descrizioni dello spazio dei nomi nel programma.

Inoltre, sebbene non sia correlato ai suggerimenti originali, questo esempio utilizza la classe StringBuilder, quindi ho anche controllato lo spazio dei nomi "System.Text". (solo VB.NET)

scena

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

La schermata utilizzata in questo esempio è una semplice schermata con un pulsante di esecuzione per controllare lo stato di installazione della KB e una casella di testo che visualizza i risultati.

Lo sto facendo in WPF, ma la stessa schermata è configurabile in Windows Form.

programma

C ManagementObjectSearcher # aggiunge ""using System.Management; all'inizio del codice per ridurre la descrizione delle classi e di altri spazi dei nomi. In VB.NET, hai specificato che lo spazio dei nomi deve essere importato nelle proprietà del progetto, quindi non è necessario scrivere nulla di speciale, ma se non l'hai fatto, devi aggiungere ".Imports System.Management

* Sia in C# che in VB.NET, se tutti i nomi di classe sono scritti da uno spazio dei nomi come "System.Management.ManagementObjectSearcher", la specifica di cui sopra non è necessaria.

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

Di seguito è riportato il codice che cerca ed elenca i KB installati.

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

Il ""ResultTextBox nella prima riga è una casella di testo per la visualizzazione dei risultati ottenuti.

creanew ManagementObjectSearcher un'istanza della classe di ricerca dell'oggetto gestito e imposta la query WMI come argomento. La sintassi di una query è quasi uguale a un'istruzione SQL, quindi esaminala in relazione a SQL per i dettagli. "Win32_QuickFixEngineering" rappresenta un aggiornamento che si applica al sistema operativo corrente.

Esegue una ricerca sulla query WMI specificata in precedenza in "query.Get() e restituisce i risultati come ".ManagementObjectCollection

Poiché "" elenca le informazioni di aggiornamento, otteniamo "" in foreach e scriviamo un identificatore univoco dal parametro "HotFixID"ManagementObjectCollectionManagementObject come risultato.

作成されたフォルダ

Quando si esegue questa operazione, gli ID di aggiornamento vengono elencati come illustrato nella figura.

Come puoi vedere quando lo esegui, è lento solo alla prima esecuzione. Dopo la seconda volta, è ragionevolmente presto.

Non è chiaro se System.Management.dll sia lento da caricare ed elaborare o l'esecuzione di query WMI sia lenta, ma il fatto che sia lento non cambia, quindi se sei preoccupato per la latenza quando lo usi, penso che sia necessario adottare misure come l'esecuzione asincrona.