Microsoft の更新プログラムで、Windows Update Agent を更新するものがあります。Windows Update そのものを更新する、というやつです。Windows Update にもバージョンがあり、それがインクリメントされるのですが、そのバージョンの確認方法はあまり有名ではありません。検索すると、以下のようなページが出てきたりします。

http://msdn.microsoft.com/en-us/library/bb680319.aspx
http://technet.microsoft.com/en-us/library/bb680319.aspx

なんで SQL が出てくるんだよ、って話です。って、System Center の話なのか。個人ユーザーとは関係なさ過ぎて困る、と。

もうちょっと頑張ると、次のページを見つけました。

http://msdn.microsoft.com/ja-jp/library/aa387091.aspx

API 使えってか。というわけで、Windows Update Agent バージョン確認プログラムを書きました。COM クライアントは久々なので忘れすぎ。VARIANT 構造体とか、使い方が特殊なくせに、COM の世界では当り前っぽいので、その使い方にたどり着くのにずいぶんと時間がかかった。サンプルプログラムがすぐに見つからんし。そんなこんなで、以下のルーチンを書いてみた。

// 
// wuaver.cpp 
//

#include <windows.h> 
#include <tchar.h> 
#include <wuapi.h> 
#include <stdio.h>

static const OLECHAR g_ApiMajorVersion[]= L"ApiMajorVersion"; 
static const OLECHAR g_ApiMinorVersion[]= L"ApiMinorVersion"; 
static const OLECHAR g_ProductVersionString[]= L"ProductVersionString";

void DoMyJob() { 
    if ( SUCCEEDED(CoInitialize(NULL)) ) { 
        IWindowsUpdateAgentInfo *pIWUA= NULL; 
        DWORD err= 0; 
        HRESULT ret= CoCreateInstance( 
            CLSID_WindowsUpdateAgentInfo, 
            NULL, 
            CLSCTX_INPROC_SERVER, 
            IID_IWindowsUpdateAgentInfo, 
            (LPVOID*)&pIWUA);

        if ( SUCCEEDED(ret) ) { 
            VARIANT varin, varout;

            // major version 
            varin.vt= VT_BSTR; 
            varin.bstrVal= SysAllocString(g_ApiMajorVersion); 
            ret= pIWUA->GetInfo(varin, &varout); 
            if ( SUCCEEDED(ret) ) { 
                wprintf_s(L"Major version: %d\r\n", varout.lVal); 
            } 
            SysFreeString(varin.bstrVal);

            // minor version 
            varin.vt= VT_BSTR; 
            varin.bstrVal= SysAllocString(g_ApiMinorVersion); 
            ret= pIWUA->GetInfo(varin, &varout); 
            if ( SUCCEEDED(ret) ) { 
                wprintf_s(L"Minor version: %d\r\n", varout.lVal); 
            } 
            SysFreeString(varin.bstrVal);

            // ProductVersionString 
            varin.vt= VT_BSTR; 
            varin.bstrVal= SysAllocString(g_ProductVersionString); 
            ret= pIWUA->GetInfo(varin, &varout); 
            if ( SUCCEEDED(ret) ) { 
                wprintf_s(L"Product version: %s\r\n", varout.bstrVal); 
            } 
            SysFreeString(varin.bstrVal);

            pIWUA->Release(); 
        }

        CoUninitialize(); 
    } 
}

int _tmain(int argc, _TCHAR* argv[]) { 
    DoMyJob(); 
    return 0; 
}

雑ですね、ええ。とりあえずは動きます。

と、ここまで完成したところで、WUA のバージョンってのは wuapi.dll のバージョンを調べればいいということを知った。おいおいおい!