Windowsサーバーやワークステーションで誰がプログラムをインストールまたは削除したかを把握するのは、特に複数の管理者が監視する大規模なエンタープライズ環境では、非常に頭の痛い作業です。幸いなことに、Windowsは多くの情報をイベントビューアーに記録しており、少し調べれば、インストールやアンインストールといった複雑なイベントの背後にあるユーザーの詳細を入手できる場合がほとんどです。これは、監査証跡の作成や、何かがうまくいかない場合の一般的なトラブルシューティングに非常に役立ちます。基本的には、イベントビューアーのログを精査して、クリーンインストールか削除かを問わず、特定のプログラムの変更を実行したユーザーを特定する方法を学びます。
MSIインストーラーを使用して「クラシック」Windowsアプリをインストールまたはアンインストールすると、Windowsは特定のIDを持つイベントをアプリケーションログに自動的に記録します。これらのイベントIDでフィルタリングすることで、アクティビティを絞り込むことができます。特に注目すべきイベントは、MSIインストールが成功したことを示す11707と、アンインストールが成功したことを示す11724です。これらのイベントには通常、プログラム名やアクションを実行したユーザーなどの詳細が含まれますが、ユーザー情報を確認するにはもう少し詳しく調べる必要があります。
- 11707 — MSI のインストールが成功しました
- 11724 — MSI削除イベント
確認するには、「ファイル名を指定して実行」ダイアログに「」と入力してイベントビューアーを開きます。 「Windows ログ」>「アプリケーション」に移動し、イベントIDでフィルタリングします(フィルタリングメニューでフィルタリングできます)。関連するイベントが見つかったら、展開して詳細な説明を確認します。「製品: Zabbix Agent 2 (64-bit) — 削除が正常に完了しました」といった行が見つかるはずです。そして重要なのは、イベントの詳細に誰が実行したかが表示されることです。ユーザー情報は通常、「ユーザー」プロパティの下にあり、ユーザー名またはドメインアカウントになります。eventvwr.msc
イベントビューアーを手動で確認するのは遅いと感じる時もありますが、そんな時こそPowerShellの真価を発揮します。特定のプログラムのインストール/アンインストールイベントと実行者情報をすべて取得するスクリプトを実行できます。これは監査証跡にとってまさに救世主と言えるでしょう。以下のスクリプトをコピーして実行し、「Zabbix」を監視対象のソフトウェアに置き換えてください。
Get-WinEvent -FilterHashtable @{LogName="Application"; ID=11707, 11724; ProviderName='MsiInstaller'} | Where-Object { $_. Message -like '*Zabbix*' } | Select TimeCreated, @{Name='Username'; Expression={(New-Object System. Security. Principal. SecurityIdentifier($_.userid)).Translate([System. Security. Principal. NTAccount]).Value}}, Message
注: このスクリプトはuserid、実際にはSIDであるフィールドを取得し、それをユーザーフレンドリーなアカウント名に変換します。設定によっては若干の調整が必要になる場合がありますが、ほとんどの場合は正常に動作します。
もう一つ便利なヒントがあります。Windows信頼性モニターはインストール/削除も追跡しているので、最近の変更をざっと確認するのに非常に便利です。特にPowerShellやイベントログに慣れていない場合は、ログを精査するよりも簡単な場合もあります。