WMI kasutamine Windowsi värskenduste installioleku määramiseks
Kokkuvõte
WMI abil saate otsida värskendusi (KB-des), mis on installitud praegu kasutatavasse Windowsi.
Töökeskkond
Toimingu kontrollimise keskkond
Windowsi versioon |
|
.NET Frameworki versioon |
|
Nõutavad süsteeminõuded
Windowsi versioon |
|
.NET Frameworki versioon |
|
aine
Mis on KB?
KB-d kasutatakse ka lühendina väljendist "kilobait" või "klaviatuur", nii et ma ei usu, et see on avalikkusele kasutatav sõna, kuid värskendusi, nagu Windowsi turvatugi ja veaparandused, nimetatakse mõnikord ID kahe esimese tähe järel "KB".
Kõigile neile värskendustele määratakse ID ja täpsustatakse vormingus "KBXXXXXXX", kus XXXXXX on suvaline number. Numbrite arv ei ole fikseeritud). Pange tähele, et mitte kõik värskendused ei järgi seda vormingut.
Muide, selle KB algne nimi on "Microsofti teabebaas" ja vastab Microsofti veebis avaldatud tehnilise artikli ID-le. Näiteks kui see on KB980218 värskendus, on vastav tehniline artikkel http://support.microsoft.com/?kbid=980218".
Programmid, mis otsivad KB installimise olekut
Kuigi näidiseid on kirjeldatud Visual Studio 2010 ja WPF-is, saab KB-kontrollprogramme kasutada ka varasemates Visual Studio, Windows Formi ja konsoolirakendustes. Selles artiklis kasutame KB installimise kontrollimiseks Windowsi haldusinstrumente (WMI).
- Windowsi haldusinstrumendid (Vikipeediast)
Viidete lisamine
WMI kasutamiseks kasutate klasse ManagementObjectSearcher ja ManagementObject, kuid nende klasside kasutamiseks peate viitama system.management .dll.
C# projektide puhul paremklõpsake Solution Exploreris valikut Viited ja valige Lisa viited.
Kui kuvatakse dialoog Lisa viide, klõpsake nuppu ". Valige vahekaardil NET System.Management ja klõpsake nuppu OK.
OK, kui lahenduseuurija viitele lisatakse "System.Management".
Kui VB.NET projekti atribuute avada, klõpsake vasakul vahekaardil "Sirvi", klõpsake paremal asuvat nuppu Lisa. Nagu eespool öeldud, kuvatakse dialoog Lisa viide, seega valige "System.Management" ja klõpsake nuppu OK.
Kui naasete eelmisele ekraanile ja lisate keskmisesse loendisse "System.Management", on see OK.
Samuti kontrollige allolevast loendist "System.Management", et jätta oma programmis välja nimeruumi kirjeldused.
Samuti, kuigi see ei ole seotud algsete näpunäidetega, kasutab see proov StringBuilderi klassi, seega kontrollisin ka nimeruumi "System.Text". (ainult VB.NET)
Stseen
Selles näidises kasutatav ekraan on lihtne ekraan, millel on käivitamisnupp KB installioleku kontrollimiseks ja tekstikast, mis kuvab tulemused.
Ma teen seda WPF-is, kuid sama ekraan on konfigureeritav Windows Formis.
programm
C ManagementObjectSearcher
# lisab koodi algusesse ""using System.Management;
, et vähendada klasside ja muude nimeruumide kirjeldust. VB.NET määrasite, et nimeruum tuleks importida projekti atribuutidesse, nii et te ei pea midagi erilist kirjutama, kuid kui te pole seda teinud, peate lisama ".Imports System.Management
* Nii C# kui ka VB.NET puhul, kui kõik klassinimed on kirjutatud nimeruumist, näiteks "System.Management.ManagementObjectSearcher
", ei ole ülaltoodud spetsifikatsioon vajalik.
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」追加)
Allpool on kood, mis otsib ja loetleb installitud 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()
Esimeses reas olev ""ResultTextBox
on tekstikast saadud tulemuste kuvamiseks.
loobnew ManagementObjectSearcher
hallatava objekti otsinguklassi eksemplari ja määrab argumendiks WMI-päringu. Päringu süntaks on peaaegu võrdne SQL-lausega, seega vaadake seda SQL-i suhtes üksikasjade saamiseks. "Win32_QuickFixEngineering" tähistab värskendust, mis kehtib praeguse operatsioonisüsteemi kohta.
Teeb otsingu WMI päringuga, mis on täpsustatud jaotises " varem,query.Get()
ja tagastab tulemused kujul ".ManagementObjectCollection
Kuna "" loetleb värskendusteabe, saame igale poole "" ja kirjutame selle tulemusena parameetrist "HotFixID"ManagementObjectCollection
ManagementObject
unikaalse identifikaatori.
Kui te seda teete, kuvatakse värskenduse ID-d, nagu on näidatud joonisel.
Nagu näete selle käivitamisel, on see aeglane ainult esimesel käivitamisel. Pärast teist korda on see mõistlikult vara.
Ei ole selge, kas System.Management.dll laadimine ja töötlemine on aeglane või WMI päringu täitmine on aeglane, kuid asjaolu, et see on aeglane, ei muutu, nii et kui olete selle kasutamisel latentsuse pärast mures, arvan, et on vaja võtta selliseid meetmeid nagu asünkroonne täitmine.