Brug WMI til at bestemme installationsstatus for Windows-opdateringer
resumé
Brug WMI til at søge efter opdateringer (i KB), der er installeret på det Windows, du bruger i øjeblikket.
Driftsmiljø
Miljø til kontrol af drift
Windows-version |
|
.NET Framework-version |
|
Systemkrav påkrævet
Windows-version |
|
.NET Framework-version |
|
stof
Hvad er 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.
- Windows Management Instrumentation (fra Wikipedia)
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.
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.
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
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"ManagementObjectCollection
ManagementObject
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.