Usar WMI para determinar el estado de instalación de las actualizaciones de Windows

Actualización de la página :
Fecha de creación de la página :

resumen

Use WMI para buscar actualizaciones (en KB) que estén instaladas en el Windows que está utilizando actualmente.

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

Entorno operativo

Entorno de comprobación de funcionamiento

Versión de Windows
  • Windows 7 Ultimate
  • Windows Vista Empresa
Versión de .NET Framework
  • 3.5 SP1
  • 4

Requisitos del sistema requeridos

Versión de Windows
  • Windows 98 o posterior (pero no todos confirmados)
Versión de .NET Framework
  • 1.0
  • 1.1
  • 2.0
  • 3.0
  • 3.5
  • 4.0

sustancia

¿Qué es KB?

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

KB también se usa como abreviatura de la expresión "kilobyte" o "teclado", por lo que no creo que sea una palabra utilizada para el público en general, pero las actualizaciones como el soporte de seguridad de Windows y las correcciones de errores a veces se denominan "KB" después de las dos primeras letras del ID.

A cada una de estas actualizaciones se le asigna un ID y se especifica en el formato "KBXXXXXXX" donde XXXXXX es cualquier número. El número de dígitos no es fijo). Tenga en cuenta, sin embargo, que no todas las actualizaciones siguen este formato.

Por cierto, el nombre original de este "KB" es "Microsoft Knowledge Base" y coincide con el identificador del artículo técnico publicado por Microsoft en la Web. Por ejemplo, si se trata de una actualización a KB980218, el artículo técnico correspondiente es http://support.microsoft.com/?kbid=980218".

Programas que buscan el estado de instalación de KB

Aunque los ejemplos se describen en Visual Studio 2010 y WPF, los programas de comprobación de KB también se pueden usar en aplicaciones anteriores de Visual Studio, Windows Forms y consola. En este artículo, usaremos Instrumental de administración de Windows (WMI) para comprobar la instalación de KB.

Adición de referencias

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

Para usar WMI, use las clases ManagementObjectSearcher y ManagementObject, pero debe consultar System.Management .dll para usar estas clases.

Para los proyectos de C#, haga clic con el botón secundario en Referencias desde el Explorador de soluciones y elija Agregar referencias.

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

Cuando aparezca el cuadro de diálogo Agregar referencia, haga clic en ". En la ficha NET, seleccione System.Management y haga clic en el botón Aceptar.

Aceptar si se agrega "System.Management" a la referencia del Explorador de soluciones.

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

Si VB.NET abrir las propiedades del proyecto, haga clic en "Examinar" en la pestaña de la izquierda, haga clic en el botón Agregar a la derecha. Como se muestra arriba, se muestra el cuadro de diálogo Agregar referencia, así que seleccione "System.Management" y haga clic en el botón Aceptar.

Si vuelve a la pantalla anterior y agrega "System.Management" a la lista central, está bien.

Además, marque "System.Management" de la lista a continuación para omitir las descripciones del espacio de nombres en su programa.

Además, aunque no está relacionado con las sugerencias originales, este ejemplo usa la clase StringBuilder, por lo que también comprobé el espacio de nombres "System.Text". (solo VB.NET)

escena

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

La pantalla utilizada en este ejemplo es una pantalla simple con un botón de ejecución para comprobar el estado de instalación de la KB y un cuadro de texto que muestra los resultados.

Lo estoy haciendo en WPF, pero la misma pantalla se puede configurar en Windows Forms.

programa

C ManagementObjectSearcher # agrega ""using System.Management; al principio del código para reducir la descripción de las clases y otros espacios de nombres. En VB.NET, especificó que el espacio de nombres debe importarse en las propiedades del proyecto, por lo que no necesita escribir nada especial, pero si no lo ha hecho, debe agregar ".Imports System.Management

* Tanto en C# como en VB.NET, si todos los nombres de clase se escriben desde un espacio de nombres como "System.Management.ManagementObjectSearcher", la especificación anterior no es necesaria.

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

A continuación se muestra el código que busca y enumera la KB instalada.

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

El ""ResultTextBox en la primera línea es un cuadro de texto para mostrar los resultados obtenidos.

creanew ManagementObjectSearcher una instancia de la clase de búsqueda del objeto administrado y establece la consulta WMI como argumento. La sintaxis de una consulta es casi igual a una instrucción SQL, así que mírala en relación con SQL para obtener más detalles. "Win32_QuickFixEngineering" representa una actualización que se aplica al sistema operativo actual.

Realiza una búsqueda en la consulta WMI especificada anteriormente en "query.Get() y devuelve los resultados como ".ManagementObjectCollection

Dado que "" enumera la información de actualización, obtenemos "" en foreach y escribimos un identificador único desde el parámetro "HotFixID"ManagementObjectCollectionManagementObject como resultado.

作成されたフォルダ

Al hacerlo, los id de actualización se enumeran como se muestra en la figura.

Como puede ver cuando lo ejecuta, es lento solo en la primera ejecución. Después de la segunda vez, es razonablemente temprano.

No está claro si System.Management.dll es lento para cargar y procesar o la ejecución de consultas WMI es lenta, pero el hecho de que sea lento no cambia, por lo que si te preocupa la latencia al usarlo, creo que es necesario tomar medidas como la ejecución asincrónica.