Windowsで特定のプログラムが起動または終了したときにスクリプトを実行する方法

これは、特定のプログラムの起動に基づいて何かを自動化したい場合に便利です。例えば、誰かがメモ帳やアプリを開いたときにスクリプトを実行したい場合などです。ただし、正直言って、設定は少し面倒です。特にグループポリシーやイベントビューアーにあまり詳しくない場合はなおさらです。それでも、一度使い始めると、プロセスが起動するたびに事前に通知が届いたり、何かを自動化したりできるので、かなり便利です。

Windowsには「誰かがメモ帳を開いたら通知する」という簡単な機能がネイティブに備わっていないため、監査ポリシーを調整し、タスクスケジューラやPowerShellと連携させる必要があります。簡単ではありませんが、手順に従えば問題なく実行できます。基本的に、イベントID 4688で新しいプロセスを監視し、メモ帳などの必要なプログラムをフィルタリングするだけであることを覚えておいてください。

Windowsでプログラムの起動を追跡し、アクションをトリガーする方法

本当に?アプリの起動を記録して、何かを自動的に実行したいですか?手順は次のとおりです。

ローカルまたはドメインのグループポリシーでプロセス追跡を有効にする

  • まず、プロセスの作成を追跡するための監査ポリシーを有効にする必要があります。「コンピューターの構成」 > 「Windowsの設定」 > 「セキュリティの設定」 > 「ローカルポリシー」 > 「監査ポリシー」に進みます。ドメインマシンで作業している場合は、gpmc.mscでグループポリシー管理コンソール(GPMC)を使用してください。
  • 「プロセス追跡の監査」を探します。ダブルクリックして「成功」に設定します。これにより、プロセスが作成されるたびにWindowsがログに記録されます。
  • お忘れなく:大きなステップです。gpupdate /forceコマンドプロンプトまたはPowerShellで実行して、ポリシーの更新をすぐにプッシュしてください。待ちきれなくてすぐにテストしたい場合に役立ちます。

完了すると、Windows はセキュリティログにイベント ID 4688 のエントリを出力し始めます。これは「新しいプロセスが作成されました」というメッセージです。イベントには、誰がプロセスを起動したか、プロセスの内容、そして何が呼び出したか(親プロセス)が表示されます。

ただし、設定によっては、ポリシーの変更を実際に有効にするために、マシンを再起動したり、ログアウトして再度ログインしたりする必要がある場合があります。

PowerShell でこれらのプロセスイベントをフィルターする

  • 次に、例えばメモ帳の起動だけを確認したいとします。便利な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*" }
  • このコマンドは、メモ帳の起動を除外します。プロセス作成イベントを取得し、タイムスタンプ、プロセス名、ユーザーを抽出し、メモ帳のみをフィルタリングします。
  • メモ帳が開かれるたびにログが記録され、それが自動化のトリガーポイントになるため、非常に便利です。

    アプリの起動時に実行するタスクをタスクスケジューラで作成する

    • タスク スケジューラ( )を開きtaskschd.msc、新しいタスクを作成します (「基本タスクの作成」または完全な制御の場合は「タスクの作成」のみ)。
    • 「メモ帳トリガーを起動」など、分かりやすい名前を付けてください。すべてのユーザーに対して実行するように設定します(おそらく「タスク実行時に次のユーザーアカウントを使用する」の設定で、BUILTIN\Users を選択してください)。グループポリシー経由で適用する場合は、`%LogonDomain%\%LogonUser%` を使用してください。
    • 「アクション」タブで、スクリプトを開く、コマンドを実行するなど、必要な操作を設定します。例えば、powershell.exeのようなパラメータを指定して実行します-ExecutionPolicy Bypass -File "C:\PS\ProcessRunEvent.ps1"。スクリプトが、メッセージの送信、メールの送信、ファイルのバックアップなど、必要な操作を確実に実行するようにしてください。
    • 次に、「トリガー」に移動し、「新規」をクリックして、「イベント時」を選択し、「カスタム」をクリックします。「新しいイベントフィルター」をクリックします。
    • フィルター設定で、ログとして「セキュリティ」 、イベント ID 4688、キーワード: 「監査成功」を選択します。
    • XMLタブに切り替えて、クエリを手動で編集するをチェックし、終了タグの直前に次の行を追加します。
    and *[EventData[Data[@Name='NewProcessName'] and (Data='C:\\Windows\\System32\\notepad.exe')]]
  • このカスタムフィルターは、メモ帳が起動されたイベントのみをキャッチします。クエリ全体は以下のようになります(タグは異なる場合があります)。
  • <QueryList> <Query Id="0" Path="Security"> <Select Path="Security"> *[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=4688]] and *[EventData[Data[@Name='NewProcessName'] and (Data='C:\\Windows\\System32\\notepad.exe')]] </Select> </Query> </QueryList>
  • タスクを保存すると、誰かがメモ帳を開くたびにスクリプトが実行されるようになります。いくつかの設定でテスト済みですが、システムによっては多少の調整が必要になる場合があります。
  • 正直言って、ちょっと変な感じがしますが、ちゃんと動作します。このイベントをキャッチすれば、ポップアップ通知の表示、メールの送信、ファイルのバックアップなど、様々なことができます。アプリの終了を追跡したい場合は、イベントID 4689「プロセスが終了しました」を探してください。

    ただし、このアプローチは少し複雑で、特にポリシーがすぐに適用されない場合やイベントフィルターがすべてをすぐにキャッチできない場合に、いくつかの癖があることにご注意ください。それでも、一度導入してしまえば、かなり強力に感じられます。