Använd WMI för att fastställa installationsstatus för Windows-uppdateringar
sammanfattning
Använd WMI för att söka efter uppdateringar (i KB) som är installerade på det Windows som du använder för närvarande.
Verksamhetsmiljö
Miljö för driftskontroll
Windows-version |
|
.NET Framework-version |
|
Systemkrav krävs
Windows-version |
|
.NET Framework-version |
|
substans
Vad är KB?
KB används också som en förkortning för uttrycket "kilobyte" eller "tangentbord", så jag tror inte att det är ett ord som används för allmänheten, men uppdateringar som Windows säkerhetsstöd och buggfixar kallas ibland "KB" efter de två första bokstäverna i ID.
Var och en av dessa uppdateringar tilldelas ett ID och anges i formatet "KBXXXXXXX" där XXXXXX är valfritt nummer. Antalet siffror är inte fast). Observera dock att inte alla uppdateringar följer detta format.
Förresten är det ursprungliga namnet på denna "KB" "Microsoft Knowledge Base" och matchar ID för den tekniska artikeln som publicerats av Microsoft på webben. http://support.microsoft.com/?kbid=980218".
Program som söker efter KB-installationsstatus
Även om exemplen beskrivs i Visual Studio 2010 och WPF kan KB-kontrollprogram också användas i tidigare Visual Studio-, Windows Form- och konsolappar. I den här artikeln använder vi Windows Management Instrumentation (WMI) för att kontrollera KB-installationen.
- Windows Management Instrumentation (från Wikipedia)
Lägga till referenser
Om du vill använda WMI använder du klasserna ManagementObjectSearcher och ManagementObject, men du måste läsa System.Management .dll för att använda dessa klasser.
För C#-projekt högerklickar du på Referenser från Solution Explorer och väljer Lägg till referenser.
När dialogrutan Lägg till referens visas klickar du på ". På fliken NET väljer du System.Management och klickar på OK knapp.
OK om "System.Management" läggs till i Solution Explorer referensen.
Om VB.NET öppnar projektegenskaperna klickar du på "Bläddra" på fliken till vänster, klickar på knappen Lägg till till höger. Som ovan visas dialogrutan Lägg till referens, så välj "System.Management" och klicka på OK-knappen.
Om du återgår till föregående skärm och lägger till "System.Management" i mittlistan är det OK.
Kontrollera också "System.Management" från listan nedan för att utelämna namnrymdsbeskrivningar i ditt program.
Även om det inte är relaterat till de ursprungliga tipsen, använder det här exemplet klassen StringBuilder, så jag kontrollerade också namnområdet "System.Text". (endast VB.NET)
scen
Skärmen som används i det här exemplet är en enkel skärm med en körningsknapp för att kontrollera installationsstatusen för KB och en textruta som visar resultaten.
Jag gör det i WPF, men samma skärm kan konfigureras i Windows Form.
program
C ManagementObjectSearcher
# lägger till ""using System.Management;
i början av koden för att minska beskrivningen av klasser och andra namnrymder. I VB.NET angav du att namnområdet skulle importeras i projektegenskaperna, så du behöver inte skriva något speciellt, men om du inte har gjort det måste du lägga till ".Imports System.Management
* I både C#- och VB.NET, om alla klassnamn skrivs från ett namnområde som "System.Management.ManagementObjectSearcher
", är ovanstående specifikation inte nödvändig.
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」追加)
Nedan är koden som söker och listar den installerade 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örsta raden är en textruta för att visa de erhållna resultaten.
skaparnew ManagementObjectSearcher
en instans av det hanterade objektets sökklass och anger WMI-frågan som ett argument. Syntaxen för en fråga är nästan lika med en SQL-sats, så titta på den i förhållande till SQL för detaljer. "Win32_QuickFixEngineering" representerar en uppdatering som gäller för det aktuella operativsystemet.
Utför en sökning på WMI-frågan som angavs tidigare i "query.Get()
och returnerar resultatet som ".ManagementObjectCollection
Eftersom "" listar uppdateringsinformationen får vi "" i förvar och skriver en unik identifierare från parametern "HotFixID"ManagementObjectCollection
ManagementObject
som ett resultat.
När du gör detta visas uppdaterings-ID:n enligt bilden.
Som du kan se när du kör den är den långsam endast vid första körningen. Efter andra gången är det hyfsat tidigt.
Det är inte klart om System.Management.dll är långsam att ladda och bearbeta eller WMI-frågekörning är långsam, men det faktum att det är långsamt ändras inte, så om du är orolig för latens när du använder den tror jag att det är nödvändigt att vidta åtgärder som asynkron körning.