WMI gebruiken om de installatiestatus van Windows-updates te bepalen

Pagina bijgewerkt :
Aanmaakdatum van pagina :

samenvatting

Gebruik WMI om te controleren op updates (in kB) die zijn geïnstalleerd op het Windows dat u momenteel gebruikt.

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

Werkomgeving

Controle-omgeving voor bewerking

Windows-versie
  • Windows 7 Ultimate
  • Windows Vista Zakelijk
.NET Framework-versie
  • 3,5 SP1
  • 4

Systeemvereisten vereist

Windows-versie
  • Windows 98 of hoger (maar niet allemaal bevestigd)
.NET Framework-versie
  • 1.0
  • 1.1
  • 2.0
  • 3.0
  • 3.5
  • 4.0

stof

Wat is KB?

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

KB wordt ook gebruikt als afkorting voor de uitdrukking "kilobyte" of "toetsenbord", dus ik denk niet dat het een woord is dat voor het grote publiek wordt gebruikt, maar updates zoals Windows-beveiligingsondersteuning en bugfixes worden soms "KB" genoemd na de eerste twee letters van de ID.

Aan elk van deze updates wordt een ID toegewezen en deze opgegeven in de indeling "KBXXXXXXX", waarbij XXXXXX een willekeurig nummer is. Het aantal cijfers staat niet vast). Houd er echter rekening mee dat niet alle updates deze indeling volgen.

De oorspronkelijke naam van deze "KB" is trouwens "Microsoft Knowledge Base" en komt overeen met de ID van het technische artikel dat door Microsoft op het web is gepubliceerd. Als het bijvoorbeeld een update van KB980218 is, is het bijbehorende technische artikel http://support.microsoft.com/?kbid=980218".

Programma's die zoeken naar de kb-installatiestatus

Hoewel de voorbeelden worden beschreven in Visual Studio 2010 en WPF, kunnen KB-controleprogramma's ook worden gebruikt in eerdere Visual Studio-, Windows Form- en console-apps. In dit artikel gebruiken we Windows Management Instrumentation (WMI) om de KB-installatie te controleren.

Referenties toevoegen

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

Als u WMI wilt gebruiken, gebruikt u de klassen ManagementObjectSearcher en ManagementObject, maar u moet system.management .dll raadplegen om deze klassen te gebruiken.

Voor C#-projecten klikt u met de rechtermuisknop op Verwijzingen vanuit Solution Explorer en kiest u Verwijzingen toevoegen.

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

Wanneer het dialoogvenster Referentie toevoegen verschijnt, klikt u op ". Selecteer system.management op het tabblad NET en klik op de knop OK.

OK als 'System.Management' is toegevoegd aan de verwijzing naar Solution Explorer.

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

Als VB.NET de projecteigenschappen opent, klikt u op "Bladeren" op het tabblad aan de linkerkant, klikt u op de knop Toevoegen aan de rechterkant. Zoals hierboven wordt het dialoogvenster Referentie toevoegen weergegeven, dus selecteer "System.Management" en klik op de knop OK.

Als u terugkeert naar het vorige scherm en "System.Management" toevoegt aan de middelste lijst, is het OK.

Vink ook "System.Management" aan in de onderstaande lijst om naamruimtebeschrijvingen in uw programma weg te laten.

Hoewel het niet gerelateerd is aan de oorspronkelijke tips, gebruikt dit voorbeeld de klasse StringBuilder, dus ik heb ook de naamruimte "System.Text" gecontroleerd. (alleen VB.NET)

toneel

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

Het scherm dat in dit voorbeeld wordt gebruikt, is een eenvoudig scherm met een uitvoeringsknop om de installatiestatus van de KB te controleren en een tekstvak waarin de resultaten worden weergegeven.

Ik maak het in WPF, maar hetzelfde scherm is configureerbaar in Windows Form.

programma

C ManagementObjectSearcher # voegt ""using System.Management; toe aan het begin van de code om de beschrijving van klassen en andere naamruimten te verminderen. In VB.NET hebt u opgegeven dat de naamruimte moet worden geïmporteerd in de projecteigenschappen, zodat u niets speciaals hoeft te schrijven, maar als u dit niet hebt gedaan, moet u "Imports System.Management.

* In zowel C# als VB.NET, als alle klassenamen worden geschreven vanuit een naamruimte zoals "System.Management.ManagementObjectSearcher", is de bovenstaande specificatie niet nodig.

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

Hieronder vindt u de code waarmee de geïnstalleerde KB wordt doorzocht en weergegeven.

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

De ""ResultTextBox in de eerste regel is een tekstvak voor het weergeven van de verkregen resultaten.

hiermee maakt unew ManagementObjectSearcher een instantie van de zoekklasse van het beheerde object en stelt u de WMI-query in als argument. De syntaxis van een query is bijna gelijk aan een SQL-instructie, dus bekijk deze in relatie tot SQL voor details. "Win32_QuickFixEngineering" staat voor een update die van toepassing is op het huidige besturingssysteem.

Hiermee wordt een zoekopdracht uitgevoerd op de WMI-query die eerder is opgegeven in "query.Get() en worden de resultaten geretourneerd als ".ManagementObjectCollection

Aangezien "" de update-informatie vermeldt, krijgen we "" in foreach en schrijven we als resultaat een unieke id van de parameter "HotFixID"ManagementObjectCollectionManagementObject.

作成されたフォルダ

Wanneer u dit doet, worden de update-id's weergegeven zoals weergegeven in de afbeelding.

Zoals je kunt zien wanneer je het uitvoert, is het alleen traag bij de eerste run. Na de tweede keer is het redelijk vroeg.

Het is niet duidelijk of System.Management.dll traag is om te laden en te verwerken of dat de uitvoering van WMI-query's traag is, maar het feit dat het traag is, verandert niet, dus als u zich zorgen maakt over latentie bij het gebruik ervan, denk ik dat het noodzakelijk is om maatregelen te nemen zoals asynchrone uitvoering.