Use o WMI para determinar o status de instalação das atualizações do Windows
resumo
Use o WMI para verificar se há atualizações (em KB) que estão instaladas no Windows que você está usando atualmente.
Ambiente Operacional
Ambiente de verificação de operação
Versão do Windows |
|
Versão do framework .NET |
|
Requisitos do sistema necessários
Versão do Windows |
|
Versão do framework .NET |
|
substância
O que é 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.
- Instrumentação de gerenciamento do Windows (da Wikipédia)
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.
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.
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
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"ManagementObjectCollection
ManagementObject
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.