Použitie WMI na určenie stavu inštalácie aktualizácií systému Windows
súhrn
Pomocou WMI vyhľadajte aktualizácie (v KB), ktoré sú nainštalované v systéme Windows, ktorý momentálne používate.
Prevádzkové prostredie
Prostredie kontroly prevádzky
Verzia systému Windows |
|
Verzia rozhrania .NET Framework |
|
Vyžadujú sa systémové požiadavky
Verzia systému Windows |
|
Verzia rozhrania .NET Framework |
|
látka
Čo je KB?
KB sa tiež používa ako skratka pre výraz "kilobajt" alebo "klávesnica", takže si nemyslím, že je to slovo používané pre širokú verejnosť, ale aktualizácie, ako je podpora zabezpečenia systému Windows a opravy chýb, sa niekedy označujú ako "KB" za prvými dvoma písmenami ID.
Každej z týchto aktualizácií je priradené ID a zadané vo formáte "KBXXXXXXX", kde XXXXXX je ľubovoľné číslo. Počet číslic nie je pevne stanovený). Upozorňujeme však, že nie všetky aktualizácie sa riadia týmto formátom.
Mimochodom, pôvodný názov tohto "KB" je "Microsoft Knowledge Base" a zhoduje sa s ID technického článku publikovaného spoločnosťou Microsoft na webe. http://support.microsoft.com/?kbid=980218".
Programy, ktoré vyhľadávajú stav inštalácie kB
Aj keď sú ukážky popísané v Visual Studio 2010 a WPF, programy na kontrolu KB je možné použiť aj v starších aplikáciách Visual Studio, Windows Form a konzoly. V tomto článku použijeme nástroj Windows Management Instrumentation (WMI) na kontrolu inštalácie KB.
- Windows Management Instrumentation (z Wikipédie)
Pridávanie referencií
Ak chcete používať WMI, používate triedy ManagementObjectSearcher a ManagementObject, ale ak chcete používať tieto triedy, musíte si prečítať .dll System.Management.
V prípade projektov C# kliknite pravým tlačidlom myši na položku Referencie v Prieskumníkovi riešení a vyberte položku Pridať referencie.
Keď sa zobrazí dialógové okno Pridať referenciu, kliknite na ". Na karte NET vyberte položku System.Management a kliknite na tlačidlo OK.
OK, ak sa do odkazu na Prieskumníka riešení pridá "System.Management".
Ak VB.NET otvorte vlastnosti projektu, kliknite na "Prehľadávať" na karte vľavo, kliknite na tlačidlo Pridať vpravo. Ako je uvedené vyššie, zobrazí sa dialógové okno Pridať referenciu, takže vyberte možnosť "System.Management" a kliknite na tlačidlo OK.
Ak sa vrátite na predchádzajúcu obrazovku a do stredného zoznamu pridáte "System.Management", je to v poriadku.
Skontrolujte tiež "System.Management" zo zoznamu nižšie, aby ste vo svojom programe vynechali popisy priestoru názvov.
Aj keď to nesúvisí s pôvodnými tipmi, táto vzorka používa triedu StringBuilder, takže som skontroloval aj priestor názvov "System.Text". (len VB.NET)
scéna
Obrazovka použitá v tejto ukážke je jednoduchá obrazovka s tlačidlom spustenia na kontrolu stavu inštalácie KB a textovým poľom, ktoré zobrazuje výsledky.
Robím to vo WPF, ale rovnaká obrazovka je konfigurovateľná vo Formulári Windows.
program
C ManagementObjectSearcher
# pridá ""using System.Management;
na začiatok kódu, aby sa zmenšil popis tried a iných menných priestorov. V VB.NET ste zadali, že priestor názvov by sa mal importovať do vlastností projektu, takže nemusíte písať nič zvláštne, ale ak ste tak neurobili, musíte pridať ".Imports System.Management
* V C# aj VB.NET, ak sú všetky názvy tried napísané z menného priestoru, ako napríklad "System.Management.ManagementObjectSearcher
", vyššie uvedená špecifikácia nie je potrebná.
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」追加)
Nižšie je uvedený kód, ktorý vyhľadáva a uvádza nainštalovanú aktualizáciu 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
v prvom riadku je textové pole na zobrazenie získaných výsledkov.
vytvorínew ManagementObjectSearcher
inštanciu triedy vyhľadávania spravovaného objektu a nastaví dotaz WMI ako argument. Syntax dotazu je takmer rovnaká ako príkaz SQL, takže sa naň pozrite vo vzťahu k SQL pre podrobnosti. "Win32_QuickFixEngineering" predstavuje aktualizáciu, ktorá sa vzťahuje na aktuálny operačný systém.
Vykoná vyhľadávanie v dotaze WMI zadanom vyššie v "query.Get()
a vráti výsledky ako ".ManagementObjectCollection
Keďže "" uvádza informácie o aktualizácii, dostaneme "" do prednej časti a v dôsledku toho napíšeme jedinečný identifikátor z parametra "HotFixID".ManagementObjectCollection
ManagementObject
Keď to urobíte, identifikátory aktualizácií sú uvedené tak, ako je to znázornené na obrázku.
Ako vidíte, keď ho spustíte, je pomalý iba pri prvom spustení. Po druhom čase je to primerane skoro.
Nie je jasné.dll či sa System.Management načítava a spracováva pomaly alebo je vykonávanie dotazov WMI pomalé, ale skutočnosť, že je pomalá, sa nemení, takže ak sa obávate latencie pri jeho používaní, myslím si, že je potrebné prijať opatrenia, ako je asynchrónne vykonávanie.