Использование WMI для определения состояния установки обновлений Windows

Страница обновлена :
Дата создания страницы :

сводка

Используйте WMI для проверки наличия обновлений (в КБ), установленных в используемой в данный момент Windows.

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

Операционная среда

Среда проверки операций

Версия для Windows
  • Windows 7 Максимальная
  • Windows Vista Бизнес
Версия платформы .NET Framework
  • 3.5 с пакетом обновления 1 (SP1)
  • 4

Требуемые системные требования

Версия для Windows
  • Windows 98 или более поздней версии (но не все подтверждены)
Версия платформы .NET Framework
  • 1.0
  • 1.1
  • 2.0
  • 3.0
  • 3.5
  • 4.0

вещество

Что такое КБ?

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

KB также используется в качестве аббревиатуры для выражения «килобайт» или «клавиатура», поэтому я не думаю, что это слово используется для широкой публики, но обновления, такие как поддержка безопасности Windows и исправления ошибок, иногда упоминаются как «KB» после первых двух букв идентификатора.

Каждому из этих обновлений присваивается идентификатор и указывается в формате "KBXXXXXXX", где XXXXXX - любое число. Количество цифр не фиксировано). Обратите внимание, однако, что не все обновления соответствуют этому формату.

Кстати, оригинальное название этой «БАЗЫ ЗНАНИЙ» — «Microsoft Knowledge Base» и совпадает с идентификатором технической статьи, опубликованной Microsoft в Интернете. Например, если это обновление до KB980218, то соответствующая техническая статья http://support.microsoft.com/?kbid=980218».

Программы, выполняющие поиск состояния установки базы знаний

Хотя примеры описаны в Visual Studio 2010 и WPF, программы проверки базы знаний также можно использовать в более ранних версиях Visual Studio, Windows Forms и консольных приложениях. В этой статье мы будем использовать инструментарий управления Windows (WMI) для проверки установки базы знаний.

Добавление ссылок

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

Для использования WMI используются классы ManagementObjectSearcher и ManagementObject, но для использования этих классов необходимо обратиться к .dll System.Management.

Для проектов C# щелкните правой кнопкой мыши Ссылки из обозревателя решений и выберите Добавить ссылки.

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

Когда появится диалоговое окно «Добавить ссылку», нажмите «. На вкладке NET выберите System.Management и нажмите кнопку ОК.

ОК, если в справочник по обозревателю решений добавлено сообщение "System.Management".

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

Если VB.NET открыть свойства проекта, нажмите «Обзор» на вкладке слева, нажмите кнопку Добавить справа. Как указано выше, отображается диалоговое окно «Добавить ссылку», поэтому выберите «System.Management» и нажмите кнопку OK.

Если вы вернетесь на предыдущий экран и добавите «System.Management» в средний список, это нормально.

Кроме того, установите флажок «System.Management» из списка ниже, чтобы опустить описания пространств имен в вашей программе.

Кроме того, хотя он не связан с исходными советами, в этом примере используется класс StringBuilder, поэтому я также проверил пространство имен "System.Text". (только VB.NET)

сцена

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

Экран, используемый в этом примере, представляет собой простой экран с кнопкой выполнения для проверки состояния установки базы знаний и текстовым полем, отображающим результаты.

Я делаю это в WPF, но тот же экран настраивается в Windows Form.

программа

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"ManagementObjectCollectionManagementObject.

作成されたフォルダ

При этом идентификаторы обновлений отображаются в списке, как показано на рисунке.

Как вы можете видеть, когда вы запускаете его, он медленный только при первом запуске. После второго раза это достаточно рано.

Неясно, является ли System.Management.dll медленным для загрузки и обработки или выполнение запроса WMI медленным, но тот факт, что он медленный, не меняется, поэтому, если вы беспокоитесь о задержке при его использовании, я думаю, что необходимо принять такие меры, как асинхронное выполнение.