WUA を使用して Windows の更新プログラムのインストール状況を調べる

ページ更新日 :
ページ作成日 :

概要

WUA を使用して現在使用している Windows にインストールされている更新プログラム(KB)をチェックします。

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

動作環境

動作確認環境

Windows バージョン
  • Windows 7 Ultimate
.NET Framework バージョン
  • 4

必須動作環境

Windows バージョン
  • Windows 7 (ほかの環境は未確認)
.NET Framework バージョン
  • 4.0 (ほかの環境は未確認)

内容

このサンプルについて

このサンプルの目的は Windows にインストールされている KB を確認することであり、「WMI を使用して Windows の更新プログラムのインストール状況を調べる」とほぼ同じ目的になっています。ただし今回のサンプルは WMI ではなく「WUA」を使用してのチェックになっています。

「KB」の説明については「WMI を使用して Windows の更新プログラムのインストール状況を調べる」に記載していますのでそちらでご確認ください。

WUA とは

WUA とは「Windows Update Agent」の略で、Windows アップデートと Windows Server アップデートサービス(WSUS)にアクセスすることを可能にする COM インタフェースのセットです。これを使用して Windows にインストールされている KB を確認することができます。

WUA についてや WUA を使ったプログラミングの詳しい説明は以下のリンク先を参照してください。

KB のインストール状況を検索するプログラム

参照の追加 (C#)

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

WUA を使用するためには COM から「WUAPI 2.0 Type Library」を参照する必要があります。

C# のプロジェクトの場合にはソリューション エクスプローラーから「参照設定」を右クリックして「参照の追加」を選択します。

参照の追加ダイアログで WUAPI 2.0 Type Library を選択して追加しています

参照の追加ダイアログが表示されたら「COM」タブから「WUAPI 2.0 Type Library」を選択して OK ボタンをクリックします。

ソリューション エクスプローラーの参照設定に「WUApiLib」が追加されていれば OK です。

参照の追加 (VB.NET)

My Project から開くを選択

VB.NET の場合はソリューション エクスプローラーから「My Project」を右クリックし、「開く」を選択します。

プロジェクトのプロパティから参照タブを選択し WUAPI 2.0 Type Library の参照を追加しています

プロパティが開いたら左のタブから「参照」をクリック、右にある追加ボタンをクリックします。C#と同じように参照の追加ダイアログが表示されるので「COM」タブから「WUAPI 2.0 Type Library」を選択して OK ボタンをクリックします。

WUAPI 2.0 Type Library が追加されていることを確認し、WUApiLib 名前空間をインポートします

前の画面に戻り、中央のリストに「WUAPI 2.0 Type Library」が追加されていれば OK です。

また、プログラムで名前空間の記述を省略するために下のリストから「WUApiLib」にチェックを入れましょう。

画面

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

今回のサンプルで使用する画面は KB のインストール状況を調べるための実行ボタンと、結果を表示するテキストボックスというシンプルな画面になっています。

WPF で作っていますが Windows Form でも同じような画面は構成可能です。

プログラム

C# では UpdateSession クラスなど名前空間の記述を減らすために、コードの最初に「using WUApiLib;」を追加しています。VB.NET ではプロジェクトのプロパティで名前空間をインポートするように指定したので特に記述はいりませんが、インポートしていない場合は「Imports WUApiLib」を追記する必要があります。

※C# も VB.NET もクラス名をすべて「WUApiLib.UpdateSession」のように名前空間から記述する場合は上記の指定はいりません。

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 WUApiLib; // 参照から「COM」より「WUAPI 2.0 Type Library」追加

下記はインストールされている KB の検索とリストアップを行っているコードです。

C#

this.ResultTextBox.Text = "";

// アップデートセッション 作成
UpdateSession us = new UpdateSession();

// アップデート検索インスタンス作成
IUpdateSearcher searcher = us.CreateUpdateSearcher();

// 「インストールされているもの」「ソフトウェア」で検索し、結果を取得
ISearchResult result = searcher.Search("IsInstalled=1 and Type='Software'");

StringBuilder builder = new StringBuilder();

// アップデート一覧からタイトル一覧を取得する。
foreach (IUpdate u in result.Updates)
{
  builder.AppendLine("[" + u.Title + "]");
}

builder.AppendLine();

// アップデート一覧から KB の番号だけ取得する。
foreach (IUpdate u in result.Updates)
{
  foreach (string str in u.KBArticleIDs)
  {
    builder.AppendLine(str);
  }
}

// 取得した KB 一覧をセット
this.ResultTextBox.Text = builder.ToString();

VB.NET

Me.ResultTextBox.Text = ""

' アップデートセッション 作成
Dim us As New UpdateSession()

' アップデート検索インスタンス作成
Dim searcher As IUpdateSearcher = us.CreateUpdateSearcher()

' 「インストールされているもの」「ソフトウェア」で検索し、結果を取得
Dim result As ISearchResult = searcher.Search("IsInstalled=1 and Type='Software'")

Dim builder As New System.Text.StringBuilder()

' アップデート一覧からタイトル一覧を取得する。
For Each u As IUpdate In result.Updates
  builder.AppendLine("[" + u.Title + "]")
Next

builder.AppendLine()

' アップデート一覧から KB の番号だけ取得する。
For Each u As IUpdate In result.Updates
  For Each str As String In u.KBArticleIDs
    builder.AppendLine(str)
  Next
Next

' 取得した KB 一覧をセット
Me.ResultTextBox.Text = builder.ToString()

内容についてはコメントの通りです。

IUpdateSearcher.Searchメソッドの引数に指定する文字列によって取得するものを変更することができます。詳しくは「IUpdateSearcher::Search Method」を参照してください。