【Windows】特定のプログラムの起動・終了時にスクリプトを自動実行する方法
はじめに
この記事では、Windowsで特定のプログラム(プロセス)の起動イベントを検知し、それに応じてアクション(スクリプトやコマンドの実行、メール送信など)を自動的に行う方法を解説します。例として、notepad.exe(メモ帳)プロセスの起動を監視し、ユーザーがメモ帳を開くたびに特定のPowerShellスクリプトが自動実行される仕組みを構築します。
ステップ1:プロセス監査ポリシーの設定
まず、Windowsでプロセス監査ポリシーを構成します。スタンドアロンのコンピューターの場合は、ローカルグループポリシーエディター(gpedit.msc)を使用します。ADドメイン内の複数のコンピューターやサーバーに一括適用したい場合は、グループポリシー管理コンソール(gpmc.msc)を使用してください。
- コンピューターの構成 → Windows の設定 → セキュリティの設定 → ローカル ポリシー → 監査ポリシー へ移動します。
- プロセス追跡の監査 を開き、成功 イベントに対して有効にします。
- 次のコマンドを実行して、グループポリシー設定を即座に適用します:
gpupdate /force
ステップ2:イベントID 4688でプロセス起動を確認する
設定後、Windowsで任意のプロセスを起動すると、イベントビューアーの「Windows ログ」→「セキュリティ」に イベントID 4688(「新しいプロセスが作成されました」)というイベントが記録されます。このイベントには、プロセスを実行したユーザー(アカウント名)、プロセス名(新しいプロセス名)、親プロセス名(作成元プロセス名)などの情報が含まれています。
PowerShellを使えば、特定のプロセスに関するアプリ起動イベントだけを効率的に抽出できます:
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4688
} | Select-Object TimeCreated,@{name='NewProcessName';expression={ $_.Properties[5].Value }}, @{name='User';expression={ $_.Properties[1].Value }} | where-object {$_.NewProcessName –like "*notepad.exe*"}
このコマンドにより、そのコンピューター上でユーザーがプログラムを起動した履歴を一覧形式で取得できます。
ステップ3:タスクスケジューラでイベント連携タスクを作成する
次に、イベントID 4688が発生したときに自動実行されるタスクを、タスクスケジューラに新規作成します。
- タスクスケジューラ(
taskschd.msc)を開き、「タスクの作成」を選択します。 - タスク名を入力し、すべてのユーザーに対して実行されるよう指定します(「タスクの実行時に使用するユーザーアカウント」→ BUILTIN\Users)。GPO経由でタスクを作成する場合は、
%LogonDomain%\%LogonUser%の形式を使用してください。 - 操作 タブで、実行したいアクションを設定します。この例ではPowerShellスクリプトを実行します(
powershell.exeを以下の引数で呼び出し:-ExecutionPolicy Bypass -file "C:\PS\ProcessRunEvent.ps1")。 - 続いて、タスクをWindowsイベントに関連付けます。トリガー タブで「新規」→「イベント時」→「カスタム」→「新しいイベントフィルター」を選択します。
- 表示されたウィンドウで、以下のイベントフィルター条件を指定します:
イベントログ:Security
イベント ID:4688
キーワード:Audit Success - XML タブに切り替え、「クエリを手動で編集する」オプションを有効にします。フィルターに次の行を追加してクエリを編集します:
and *[EventData[Data[@Name='NewProcessName'] and (Data='C:\Windows\System32\notepad.exe')]] - すると、以下のようなXMLクエリが完成します:
<QueryList> <Query Id="0" Path="Security"> <Select Path="Security"> *[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Task = 13312 and (band(Keywords,9007199254740992)) and (EventID=4688)]] and *[EventData[Data[@Name='NewProcessName'] and (Data='C:\Windows\System32\notepad.exe')]] </Select> </Query> </QueryList>
- タスクを保存します。
動作確認と応用テクニック
実際にnotepad.exeを実行してみてください。ユーザーがメモ帳を開くたびに、設定したPowerShellスクリプトが自動的に実行されるはずです。たとえば、ポップアップ通知を表示したり、PowerShellからメールを送信したりといった処理を組み込むことが可能です。
また、特定のアプリが終了した後にバックアップスクリプトを実行したいケースもあるでしょう。プログラムの終了を追跡したい場合は、イベントID 4689(「プロセスが終了しました」)を使用します。
以前ご紹介した「プロセスが停止したら自動的に再起動させるPowerShellスクリプト」という手法もありますが、今回のようにプロセスの起動・終了イベントを直接追跡するソリューションの方がはるかにエレガントで、Windows上の実行中プロセスを常時監視するためのPowerShellスクリプトも不要になります。
-
Windows 10でトラブルシューティングを自動的に実行する方法【推奨トラブルシューティング設定】
かつて「Microsoft Fixit」として提供されていたツールは、進化を重ね、現在では自動化されたソリューションへと成長しました。Windows 10には以前からトラブルシューティングツールが標準搭載されていましたが、バージョン1903以降、さらに一歩進んだ機能が登場しています。それが「推奨トラブルシューティング(Recommended troubleshooting)」です。この機能を有効にすると、パソコンで発生した問題を自動的に修復し、その結果を通知してくれます。 本記事では、Windows 10が必要に応じてトラブルシューティングツールを自動的に実行するよう設定する方法を詳しく解説し
-
WindowsでプログラムのCPU使用率を制限する3つの方法【タスクマネージャー・Process Lasso】
PCのCPU使用率を常に把握しておくことは非常に重要です。CPUに過度な負荷がかかると、スロットリングが発生し、PC全体のパフォーマンス低下につながる可能性があります。これは日常的な作業にも大きな影響を与えるため、バックグラウンドで動作している重要度の低いプログラムがCPUリソースを占有していないか、必ず確認するようにしましょう。本記事では、必要以上にCPUを消費するプログラムに対処するためのさまざまな方法をご紹介します。CPUはコンピューターの中でも最も重要なパーツの一つです。中には非常に多くのリソースを要求し、利用可能なリソースをすべて奪おうとするプログラムも存在します。前述の通り、このよ