Brug WMI til at bestemme installationsstatus for Windows-opdateringer

Side opdateret :
Dato for oprettelse af side :

resumé

Brug WMI til at søge efter opdateringer (i KB), der er installeret på det Windows, du bruger i øjeblikket.

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

Driftsmiljø

Miljø til kontrol af drift

Windows-version
  • Windows 7 Ultimate
  • Windows Vista Erhverv
.NET Framework-version
  • 3.5 SP1
  • 4

Systemkrav påkrævet

Windows-version
  • Windows 98 eller nyere (men ikke alle bekræftet)
.NET Framework-version
  • 1.0
  • 1.1
  • 2.0
  • 3.0
  • 3.5
  • 4.0

stof

Hvad er KB?

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

KB bruges også som en forkortelse for udtrykket "kilobyte" eller "tastatur", så jeg tror ikke, det er et ord, der bruges til offentligheden, men opdateringer som Windows-sikkerhedssupport og fejlrettelser kaldes undertiden "KB" efter de to første bogstaver i ID'et.

Hver af disse opdateringer tildeles et id og specificeres i formatet "KBXXXXXXX", hvor XXXXXX er et hvilket som helst nummer. Antallet af cifre er ikke fast). Bemærk dog, at ikke alle opdateringer følger dette format.

Forresten er det oprindelige navn på denne "KB" "Microsoft Knowledge Base" og matcher id'et for den tekniske artikel udgivet af Microsoft på internettet. http://support.microsoft.com/?kbid=980218".

Programmer, der søger efter KB-installationsstatus

Selvom eksemplerne er beskrevet i Visual Studio 2010 og WPF, kan KB-kontrolprogrammer også bruges i tidligere Visual Studio-, Windows Form- og konsolapps. I denne artikel bruger vi WMI (Windows Management Instrumentation) til at kontrollere KB-installationen.

Tilføjelse af referencer

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

Hvis du vil bruge WMI, skal du bruge klasserne ManagementObjectSearcher og ManagementObject, men du skal henvise til System.Management .dll for at bruge disse klasser.

For C#-projekter skal du højreklikke på Referencer fra Løsningsoversigt og vælge Tilføj referencer.

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

Når dialogboksen Tilføj reference vises, skal du klikke på ". Fra fanen NET skal du vælge System.Management og klikke på knappen OK.

OK, hvis "System.Management" føjes til Solution Explorer-referencen.

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

Hvis VB.NET åbne projektegenskaberne, skal du klikke på "Gennemse" fra fanen til venstre, klikke på knappen Tilføj til højre. Som ovenfor vises dialogboksen Tilføj reference, så vælg "System.Management" og klik på KNAPPEN OK.

Hvis du vender tilbage til den forrige skærm og tilføjer "System.Management" til den midterste liste, er det OK.

Tjek også "System.Management" fra listen nedenfor for at udelade navnerumsbeskrivelser i dit program.

Selvom det ikke er relateret til de originale tip, bruger denne prøve StringBuilder-klassen, så jeg kontrollerede også navneområdet "System.Text". (kun VB.NET)

scene

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

Skærmen, der bruges i dette eksempel, er en simpel skærm med en udførelsesknap til at kontrollere installationsstatus for KB og et tekstfelt, der viser resultaterne.

Jeg gør det i WPF, men den samme skærm kan konfigureres i Windows Form.

program

C ManagementObjectSearcher # tilføjer ""using System.Management; til begyndelsen af koden for at reducere beskrivelsen af klasser og andre navneområder. I VB.NET har du angivet, at navneområdet skal importeres i projektegenskaberne, så du behøver ikke at skrive noget særligt, men hvis du ikke har gjort det, skal du tilføje ".Imports System.Management

* I både C# og VB.NET, hvis alle klassenavne er skrevet fra et navneområde som "System.Management.ManagementObjectSearcher", er ovenstående specifikation ikke nødvendig.

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

Nedenfor er koden, der søger og viser den installerede 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 i første linje er et tekstfelt til visning af de opnåede resultater.

opretternew ManagementObjectSearcher en forekomst af det administrerede objekts søgeklasse og angiver WMI-forespørgslen som et argument. Syntaksen for en forespørgsel er næsten lig med en SQL-sætning, så se på den i forhold til SQL for detaljer. "Win32_QuickFixEngineering" repræsenterer en opdatering, der gælder for det aktuelle operativsystem.

Udfører en søgning på wmi-forespørgslen, der er angivet tidligere i "query.Get() og returnerer resultaterne som ".ManagementObjectCollection

Da "" viser opdateringsoplysningerne, får vi "" i foreach og skriver en unik identifikator fra parameteren "HotFixID"ManagementObjectCollectionManagementObject som følge heraf.

作成されたフォルダ

Når du gør dette, vises opdaterings-id'erne som vist i figuren.

Som du kan se, når du kører det, er det kun langsomt ved første løb. Efter anden gang er det rimeligt tidligt.

Det er ikke klart, om System.Management.dll er langsom at indlæse og behandle eller WMI-forespørgselsudførelse er langsom, men det faktum, at det er langsomt, ændres ikke, så hvis du er bekymret for latenstid, når du bruger det, tror jeg, at det er nødvendigt at træffe foranstaltninger som asynkron udførelse.