Use o WMI para determinar o status de instalação das atualizações do Windows

Página atualizada :
Data de criação de página :

resumo

Use o WMI para verificar se há atualizações (em KB) que estão instaladas no Windows que você está usando atualmente.

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

Ambiente Operacional

Ambiente de verificação de operação

Versão do Windows
  • Windows 7 Ultimate
  • Windows Vista Business
Versão do framework .NET
  • 3.5 SP1
  • 4

Requisitos do sistema necessários

Versão do Windows
  • Windows 98 ou mais tarde (mas nem todos confirmados)
Versão do framework .NET
  • 1.0
  • 1.1
  • 2.0
  • 3.0
  • 3.5
  • 4.0

substância

O que é KB?

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

KB também é usado como abreviação para a expressão "kilobyte" ou "teclado", então não acho que seja uma palavra usada para o público em geral, mas atualizações como suporte de segurança do Windows e correções de bugs são às vezes referidas como "KB" após as duas primeiras letras do ID.

Cada uma dessas atualizações é atribuída a um ID e especificada no formato "KBXXXXXXX" onde XXXXXX é qualquer número. O número de dígitos não é fixo). Observe, no entanto, que nem todas as atualizações seguem este formato.

A propósito, o nome original deste "KB" é "Microsoft Knowledge Base" e corresponde ao ID do artigo técnico publicado pela Microsoft na Web. Por exemplo, se for uma atualização para KB980218, o artigo técnico correspondente é http://support.microsoft.com/?kbid=980218".

Programas que buscam o status de instalação do KB

Embora as amostras sejam descritas no Visual Studio 2010 e no WPF, os programas de verificação de KB também podem ser usados em aplicativos anteriores do Visual Studio, Windows Form e console. Neste artigo, usaremos o WMI (Windows Management Instrumentation, instrumentação de gerenciamento do Windows) para verificar a instalação do KB.

Adicionando referências

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

Para usar o WMI, você usa as classes ManagementObjectSearcher e ManagementObject, mas você deve consultar o System.Management .dll para usar essas classes.

Para projetos C#, clique com o botão direito do mouse em Referências do Solution Explorer e escolha Adicionar referências.

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

Quando a caixa de diálogo Adicionar referência for exibida, clique em ". Na guia NET, selecione Sistema.Gerenciamento e clique no botão OK.

OK se "System.Management" for adicionado à referência Solution Explorer.

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

Se VB.NET abrir as propriedades do projeto, clique em "Procurar" na guia à esquerda, clique no botão Adicionar à direita. Como acima, a caixa de diálogo Adicionar referência é exibida, então selecione "Sistema.Gerenciamento" e clique no botão OK.

Se você retornar à tela anterior e adicionar "System.Management" à lista do meio, está tudo bem.

Além disso, verifique "System.Management" na lista abaixo para omitir descrições do namespace em seu programa.

Além disso, embora não esteja relacionado com as dicas originais, esta amostra usa a classe StringBuilder, então eu também verifiquei o namespace "System.Text". (somente VB.NET)

cena

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

A tela usada nesta amostra é uma tela simples com um botão de execução para verificar o status de instalação do KB e uma caixa de texto que exibe os resultados.

Estou fazendo isso no WPF, mas a mesma tela é configurável no Windows Form.

programa

C ManagementObjectSearcher # adiciona ""using System.Management; ao início do código para reduzir a descrição de classes e outros namespaces. Em VB.NET, você especificou que o namespace deve ser importado nas propriedades do projeto, então você não precisa escrever nada especial, mas se você não fez isso, você precisa adicionar ".Imports System.Management

* Tanto em C# quanto em VB.NET, se todos os nomes de classe forem escritos a partir de um namespace como "System.Management.ManagementObjectSearcher", a especificação acima não é necessária.

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

Abaixo está o código que pesquisa e lista o KB instalado.

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

O ""ResultTextBox na primeira linha é uma caixa de texto para exibir os resultados obtidos.

crianew ManagementObjectSearcher uma instância da classe de pesquisa do objeto gerenciado e define a consulta do WMI como um argumento. A sintaxe de uma consulta é quase igual a uma instrução SQL, então olhe para ela em relação ao SQL para obter detalhes. "Win32_QuickFixEngineering" representa uma atualização que se aplica ao sistema operacional atual.

Realiza uma pesquisa na consulta WMI especificada anteriormente em "query.Get() e retorna os resultados como ".ManagementObjectCollection

Como "" lista as informações de atualização, recebemos "" em preníquio e escrevemos um identificador exclusivo do parâmetro "HotFixID"ManagementObjectCollectionManagementObject como resultado.

作成されたフォルダ

Quando você faz isso, os IDs de atualização são listados como mostrado na figura.

Como você pode ver quando você executá-lo, é lento apenas na primeira corrida. Depois da segunda vez, é razoavelmente cedo.

Não está claro se o System.Management.dll é lento para carregar e processar ou a execução de consultas WMI é lento, mas o fato de ser lento não muda, portanto, se você está preocupado com a latência ao usá-lo, eu acho que é necessário tomar medidas como a execução assíncroda.