C#を使ってインストールされているKB情報を調べる方法


はじめに

Windowsでは更新プログラムでインストールされている情報を参照することができますが、より詳しい情報はWUAPIを利用して取得することができます。ここでは、WUAPIを利用して更新プログラムの詳細情報を取得したいと思います。

実戦で役立つ Cプログラミングのイディオム/定石&パターン
C#のプログラムを作成するには,解こうとする問題の手順と利用するデータ構造を考え,それをC#のコードとして記述するスキルが必要になってきますが,そういったスキルは,現場で利用されているイディオムや定石といったパターンを学習することで得られます。

WUApiLibをを利用する

Windows Update Agent APIを利用するためには、まずWUApiLibというライブラリを読み込みます。
読み込むと、WUAPIのクラスを利用することができるようになります。

using WUApiLib;

namespace WUSample
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                UpdateSession us = new UpdateSession();
                IUpdateSercher searcher = us.CreateUpdateSearcher();
                int installed = 1;
                string[] items = new string[] {"Title","KBArticleIDs"}
                ISearchResult isr = searcher.Search($"IsInstalled={installed} and Type='Software'");
                if(isr != null && isr.ResultCode == OperationResultCode.orcSucceeded)
                {
                    foreach (IUpdate updateInfo in isr.Updates)
                    {
                        foreach(string item in items)
                        {
                            object value = GetPropertyValue(updateInfo, item);
                            string valueS;
                            if(value != null)
                            {
                                // 今回はサンプルとしてタイプを指定していますが
                                // 用途に応じてタイプを追加してください。
                                if(value.GetType() == typeof(string[]))
                                {
                                    StringBuilder sb = new StringBuilder();
                                    string[] vals = (string[])value;
                                    foreach(string val in vals)
                                    {
                                        sb.AppendFormat($"{sb.Length}{val}");   
                                    }
                                    valueS = sb.ToString();
                                }
                                else
                                {
                                    valueS = value.ToString();   
                                }
                            }
                            else
                            {
                                valueS = null;   
                            }
                            Console.WriteLine($"[INFO][{item}] {valueS}");
                        }
                    }
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);   
            }
        }

        private static string GetPropertyValue(IUpdate updateInfo, string propertyName)
        {
            // 以下URLを参照
            // http://msdn.microsoft.com/en-us/library/windows/desktop/aa386907%28v=vs.85%29.aspx
            switch(propertyName)
            {
                case "Title" :
                    return updateInfo.Title;
                case "KBArticleIDs" :
                    return GetString(updateInfo.KBArticleIDs);
                default :
                    return "";
            }
        }

        private static string GetString(StringCollection stringCollection)
        {
            StringBuilder sb = new StringBuilder("[");
            foreach(string s in stringCollection)
            {
                if (sb.Length > 1)
                {
                    sb.Append(",");
                }
                sb.Append(s);
            }
            sb.Append("]");
            return sb.ToString();
        }
    }
}

出力結果は下記のようになります。

[INFO][Title] Windows Defender Antivirus のセキュリティ インテリジェンス更新プログラム - KBXXXXX ・・・
[INFO][KBArticleIDs] [2267602]
・・・

今回は「Title」と「KBArticleIDs」のみ出力対象としましたが、MSサイトを参考に他にも様々な情報を
出力できますので、参考にしてみてください。