Microsoft.Update.SessionのQueryHistoryは0オリジン

Windows UpdateをPowerShellで取得している場合、そのPowerShellをマイクロソフトのTechNet情報をもとに作成した場合は注意が必要です。

Windows Updateでサーバーをアップデートして、その情報を取得するときにPowerShellを使用しているケースは多いと思います。

その際に、Microsoft.Update.SessionというCOMオブジェクトを使用する方法を使っている方は多いのではないでしょうか。マイクロソフトのTechNetに掲載されている有名な方法です。

Function Get-MicrosoftUpdates
{
  Param(
        $NumberOfUpdates,
        [switch]$all
       )
  $Session = New-Object -ComObject Microsoft.Update.Session
  $Searcher = $Session.CreateUpdateSearcher()
  if($all)
    {
      $HistoryCount = $Searcher.GetTotalHistoryCount()
      $Searcher.QueryHistory(1,$HistoryCount)
    }
  Else { $Searcher.QueryHistory(1,$NumberOfUpdates) }
}

参照: Hey, Scripting Guy! コンピューターに追加されたすべての更新プログラムの一覧を取得する方法はありますか

これはWindows Updateの更新履歴を取得する関数です。この関数を実行することで、Windows Updateの一覧を取得することができます。

ところが、この情報には嘘があります。このコードを実行すると、ひとつ足りない状態の更新履歴しか取得できません。正しくは以下の通りです。

Function Get-MicrosoftUpdates
{
  Param(
        $NumberOfUpdates,
        [switch]$all
       )
  $Session = New-Object -ComObject Microsoft.Update.Session
  $Searcher = $Session.CreateUpdateSearcher()
  if($all)
    {
      $HistoryCount = $Searcher.GetTotalHistoryCount()
      $Searcher.QueryHistory(0,$HistoryCount)
    }
  Else { $Searcher.QueryHistory(0,$NumberOfUpdates) }
}

QueryHistoryの最初の引数は0オリジンで、1オリジンではないということです。もし、TechNetの情報を信じてWindows Updateの更新履歴を取得しているなら、早急に修正したほうがいいと思います。

Follow me!

Feedlyで新着記事をチェックしよう!

Feedlyでフォローしておけば、新着記事をチェックすることができます。ぜひ、この機会にFeedlyに追加しておきましょう。