none
これまでに適用したHotFixIDを取得したい RRS feed

  • 質問

  • PowerShellでこれまでに適用させた更新パッチを確認するには「Get-WmiObject win32_QuickFixEngineering」もしくは「Get-HotFix」で情報が得られるのはわかります。

    でもこれらの命令では、たとえばWindows10の最新パッチである「KB3200970」を適用させると、前の月に適用させた「KB3194798」が一覧から消えてしまいます。

    しかし「KB3200970」をアンインストールしてから前述の命令で一覧を取得すると「KB3194798」が出てきます。

    このことから過去にインストールした更新パッチ情報をどこかに持っていると思うのですが、どのように情報を取得するかお教えいただけないでしょうか。

    2016年12月5日 7:19

回答

  • 見てくださった皆さん。

    本件についてテクニカルサポートに問い合わせました。

    結果、私が求めるものはMicrosoftの非公開情報とのことでした。

    また、Microsoft.Update.Sessionで得られる情報はインストール履歴であって、インストール状態を示すものではないとのことです。

    正攻法ではあきらめるしかなさそうです。

    牟田口さん、チャブーンさん、本当にありがとうございました。


    2016年12月12日 10:56

すべての返信

  • Win32_QuickFixEngineeringや、このクラスを参照するGet-HotFixコマンドでは、すべてのインストール済みアップデートを取得できるわけではないようです。(アンインストールできるもののみ?)

    Microsoft.Update.SessionというCOMオブジェクトを使えば可能です。すべてのインストール済み更新を取得する関数を書いてみたので以下に示します。

    function Get-InstalledKB
    {
        $session = New-Object -ComObject Microsoft.Update.Session
        $searcher = $session.CreateUpdateSearcher()
        $results = $searcher.QueryHistory(0, $searcher.GetTotalHistoryCount())
        $results|
            where Title -ne $null|
            select @(
                @{L="HotFixId";E={$_.Title -replace '^.*(KB\d+).*$','$1'}},
                "Date",
                "Title",
                "Description"
            )
    }

    この関数を使うとHotFixID(KB番号)、日付、更新のタイトル、更新の詳細説明が取得できます。

    Get-InstalledKB | where HotFixId -eq KB3194798

    のように、KBの有無を確認したりすることができます。


    2016年12月5日 11:55
    モデレータ
  • チャブーンです。

    牟田口さんの回答への補足ですが、したのページに「Scripto Guy」の答えが載っていますね。

    https://gallery.technet.microsoft.com/scriptcenter/04d35e17-dbcd-4453-a939-7ad19c18983c

    Microsoft.Update.Sessionオブジェクトは存じていましたが、QueryHistoryの真の機能(HotFixの過去情報も含めてとれる)は存じていなかったので、個人的に勉強になりました。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2016年12月5日 14:16
  • 牟田口さんありがとうございました。

    無事に過去のHotFixIDが取得できました。

    チャブーンさんもありがとうございます。

    こんなサイトがあったんですね、全然気が付きませんでした。

    もっとマイクロソフトのサイトを調べるべきでしたね。

    お二方、本当にありがとうございました。

    2016年12月6日 6:47
  • あれからいろいろ試して気が付きました。

    このスクリプトはアンインストールしてもすべて情報が残るんですね。

    「現在インストールしてあるもの一覧」じゃなくて「これまでにインストールした実績の一覧」でした。

    Scripting Guyさんのスクリプトのほうが情報が多く出ているのですが、こちらも取得している元は同じなので結果としてはかわりませんし、アンインストール前後で取得できた情報が書き換わっているわけでもなさそうです。

    何かいい手はないでしょうか。

    2016年12月9日 12:26
  • select @( @{L="HotFixId";E={$_.Title -replace '^.*(KB\d+).*$','$1'}}, "Date", "Title", "Description", "Operation", "HResult" )

    スクリプトを上記のように一部変更して、Operationというプロパティの値を見てください。インストールの場合は1、アンインストールの場合は2を返すようです。まずは、本当にそうなっているか確認いただけますでしょうか。当方の環境ではアップデートのアンインストールをしたことがないので、確認できませんでした。

    理屈上だと、同一のKBの履歴を時系列でソートし、最後の操作がインストール、かつ、インストールが成功(HResult=0)していれば、そのKBはインストールされた状態であることが確定します。ただ、あくまで理屈上の話であって、本当にこの方法で良いのか、私にはちょっと断定できません。

    $searcher.Search("IsInstalled=1").Updates で取れそうな気がしたのですが、これだとGet-HotFixと同様、アンインストール可能な(?)一部のアップデートのみしか取得できないんですよね。

    2016年12月9日 13:07
    モデレータ
  • 牟田口さん

    情報ありがとうございます。

    Operationの値を見てみましたが、すべてのパッチで値が1でした。

    このスクリプトを使っていろいろなPCで試したところ、普段は使用せず自動でパッチを適用させていたPCでOperationが2になっているのを発見しました。

    そのPCでどのような状況でOperationが2になっていたのか調べたら、6月ごろに適用された「KB3159398」というパッチが7月にOperation=2としてアンインストールされていました。しかし誰もPCを操作していないことからおそらく自動で消されたものと推測します。

    なんとなく思ったのですが、「プログラムの削除」画面からアンインストールとか人の手を介して削除したものはこのComオブジェクトに反映されないのかもしれません。

    追記:回答としてマークした牟田口さんの発言ですが、申し訳ありませんが取り消させていただきました。

    • 編集済み hiramatsu 2016年12月12日 0:21
    2016年12月11日 6:23
  • 見てくださった皆さん。

    本件についてテクニカルサポートに問い合わせました。

    結果、私が求めるものはMicrosoftの非公開情報とのことでした。

    また、Microsoft.Update.Sessionで得られる情報はインストール履歴であって、インストール状態を示すものではないとのことです。

    正攻法ではあきらめるしかなさそうです。

    牟田口さん、チャブーンさん、本当にありがとうございました。


    2016年12月12日 10:56