Використання WMI для визначення стану інсталяції оновлень Windows
зведення
Використовуйте WMI для перевірки наявності оновлень (у поданні KB), інстальованих у windows, яка зараз використовується.
Операційне середовище
Середовище перевірки роботи
Версія для Windows |
|
Версія фреймворку .NET |
|
Необхідні системні вимоги
Версія для Windows |
|
Версія фреймворку .NET |
|
речовина
Що таке КБ?
KB також використовується як абревіатура для виразу "кілобайт" або "клавіатура", тому я не думаю, що це слово, яке використовується для широкої публіки, але такі оновлення, як підтримка безпеки Windows і виправлення помилок, іноді називаються "KB" після перших двох букв ID.
Кожному з цих оновлень присвоюється ID і вказується у форматі "KBXXXXXXXX", де XXXXXX - це будь-яке число. Кількість цифр не фіксована). Однак зауважте, що не всі оновлення мають такий формат.
До речі, оригінальна назва цього «КБ» - «База знань Microsoft» і збігається з ID технічної статті, опублікованої Microsoft в Мережі. Наприклад, якщо це оновлення до KB980218, то відповідна технічна стаття є http://support.microsoft.com/?kbid=980218".
Програми, які шукають стан інсталяції КБ
Хоча зразки описані у Visual Studio 2010 і WPF, програми перевірки kb-check також можна використовувати в попередніх програмах Visual Studio, Windows Form і консольних програмах. У цій статті ми будемо використовувати інструменти керування Windows (WMI), щоб перевірити інсталяцію КБ.
- Інструменти керування Windows (з Вікіпедії)
Додавання посилань
Для використання WMI використовуються класи ManagementObjectSearcher і ManagementObject, але для використання цих класів необхідно звернутися до System.Management .dll.
Для проектів C# клацніть правою кнопкою миші «Посилання» з «Провідника рішень» і виберіть «Додати посилання».
Коли з'явиться діалогове вікно Додати посилання, натисніть на ". На вкладці NET виберіть System.Management і натисніть кнопку OK.
Ok, якщо до посилання у Провіднику рішень додано "Система.Керування".
Якщо VB.NET відкрити властивості проекту, натисніть "Огляд" з вкладки зліва, натисніть кнопку Додати праворуч. Як і вище, відображається діалогове вікно «Додати посилання», тому виберіть «Система.Управління» і натисніть кнопку ОК.
Якщо повернутися до попереднього екрану і додати в середній список "Система.Управління", це нормально.
Крім того, відзначте "System.Management" зі списку нижче, щоб пропустити описи простору імен у вашій програмі.
Також, хоча він і не пов'язаний з оригінальними порадами, в цьому зразку використовується клас StringBuilder, тому я також поставив галочку на просторі імен "System.Text". (тільки VB.NET)
Сцени
Екран, який використовується в цьому зразку, являє собою простий екран з кнопкою виконання для перевірки стану установки КБ і текстовим полем, що відображає результати.
Я роблю це в WPF, але той самий екран налаштовується у формі Windows.
програма
C ManagementObjectSearcher
# додає ""using System.Management;
на початок коду, щоб зменшити опис класів та інших просторів імен. У VB.NET ви вказали, що у властивостях проекту слід імпортувати простір імен, тому нічого особливого писати не потрібно, але якщо ви цього не зробили, потрібно додати ".Imports System.Management
* Як в C#, так і в VB.NET, якщо всі імена класів написані з простору імен типу "System.Management.ManagementObjectSearcher
", наведена вище специфікація не є обов'язковою.
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」追加)
Нижче наведено код, який шукає та перераховує встановлений КБ.
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
в першому рядку являє собою текстове поле для відображення отриманих результатів.
створюєnew ManagementObjectSearcher
екземпляр класу пошуку керованого об'єкта та встановлює запит WMI як аргумент. Синтаксис запиту практично дорівнює оператору SQL, тому подивіться на нього по відношенню до SQL для отримання деталей. "Win32_QuickFixEngineering" являє собою оновлення, яке застосовується до поточної операційної системи.
Виконує пошук за запитом WMI, вказаним раніше в "query.Get()
і повертає результати як ".ManagementObjectCollection
Оскільки "" перераховує інформацію про оновлення, ми отримуємо "" в foreach і в результаті пишемо унікальний ідентифікатор з параметра "HotFixID"ManagementObjectCollection
ManagementObject
.
Коли ви це робите, ідентифікатори оновлень відображаються так, як показано на малюнку.
Як бачите, коли ви його запускаєте, він повільний тільки при першому запуску. Після другого разу досить рано.
Незрозуміло, чи повільно завантажується і обробляється System.Management.dll або виконується WMI-запитів повільно, але той факт, що він повільний, не змінюється, тому якщо вас турбує затримка при його використанні, думаю, що необхідно вжити таких заходів, як асинхронне виконання.