Usar WMI para determinar el estado de instalación de las actualizaciones de Windows
resumen
Use WMI para buscar actualizaciones (en KB) que estén instaladas en el Windows que está utilizando actualmente.
Entorno operativo
Entorno de comprobación de funcionamiento
Versión de Windows |
|
Versión de .NET Framework |
|
Requisitos del sistema requeridos
Versión de Windows |
|
Versión de .NET Framework |
|
sustancia
¿Qué es 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.
- Instrumental de administración de Windows (de Wikipedia)
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.
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.
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
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"ManagementObjectCollection
ManagementObject
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.