トップ回答者
これまでに適用したHotFixIDを取得したい

質問
-
PowerShellでこれまでに適用させた更新パッチを確認するには「Get-WmiObject win32_QuickFixEngineering」もしくは「Get-HotFix」で情報が得られるのはわかります。
でもこれらの命令では、たとえばWindows10の最新パッチである「KB3200970」を適用させると、前の月に適用させた「KB3194798」が一覧から消えてしまいます。
しかし「KB3200970」をアンインストールしてから前述の命令で一覧を取得すると「KB3194798」が出てきます。
このことから過去にインストールした更新パッチ情報をどこかに持っていると思うのですが、どのように情報を取得するかお教えいただけないでしょうか。
回答
-
見てくださった皆さん。
本件についてテクニカルサポートに問い合わせました。
結果、私が求めるものはMicrosoftの非公開情報とのことでした。
また、Microsoft.Update.Sessionで得られる情報はインストール履歴であって、インストール状態を示すものではないとのことです。
正攻法ではあきらめるしかなさそうです。
牟田口さん、チャブーンさん、本当にありがとうございました。
- 編集済み hiramatsu 2016年12月12日 11:02
- 回答としてマーク 牟田口大介Moderator 2016年12月14日 0:10
すべての返信
-
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の有無を確認したりすることができます。
- 回答の候補に設定 チャブーンMVP 2016年12月5日 14:17
- 回答としてマーク hiramatsu 2016年12月6日 6:28
- 回答としてマークされていない hiramatsu 2016年12月11日 6:04
- 回答の候補の設定解除 牟田口大介Moderator 2016年12月14日 0:10
-
チャブーンです。
牟田口さんの回答への補足ですが、したのページに「Scripto Guy」の答えが載っていますね。
https://gallery.technet.microsoft.com/scriptcenter/04d35e17-dbcd-4453-a939-7ad19c18983c
Microsoft.Update.Sessionオブジェクトは存じていましたが、QueryHistoryの真の機能(HotFixの過去情報も含めてとれる)は存じていなかったので、個人的に勉強になりました。
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
-
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と同様、アンインストール可能な(?)一部のアップデートのみしか取得できないんですよね。
-
牟田口さん
情報ありがとうございます。
Operationの値を見てみましたが、すべてのパッチで値が1でした。
このスクリプトを使っていろいろなPCで試したところ、普段は使用せず自動でパッチを適用させていたPCでOperationが2になっているのを発見しました。
そのPCでどのような状況でOperationが2になっていたのか調べたら、6月ごろに適用された「KB3159398」というパッチが7月にOperation=2としてアンインストールされていました。しかし誰もPCを操作していないことからおそらく自動で消されたものと推測します。
なんとなく思ったのですが、「プログラムの削除」画面からアンインストールとか人の手を介して削除したものはこのComオブジェクトに反映されないのかもしれません。
追記:回答としてマークした牟田口さんの発言ですが、申し訳ありませんが取り消させていただきました。
- 編集済み hiramatsu 2016年12月12日 0:21
-
見てくださった皆さん。
本件についてテクニカルサポートに問い合わせました。
結果、私が求めるものはMicrosoftの非公開情報とのことでした。
また、Microsoft.Update.Sessionで得られる情報はインストール履歴であって、インストール状態を示すものではないとのことです。
正攻法ではあきらめるしかなさそうです。
牟田口さん、チャブーンさん、本当にありがとうございました。
- 編集済み hiramatsu 2016年12月12日 11:02
- 回答としてマーク 牟田口大介Moderator 2016年12月14日 0:10