Как запустить скрипт (действие) при запуске (завершении) определенной программы в Windows?

В этой статье мы рассмотрим, как отследить событие запуска определённой программы (процесса) в Windows и выполнить какое-то действие (запустить скрипт, отправить email и т.д.). В качестве примера мы будем отслеживать запуск процесса notepad.exe, когда пользователь открывает эту программу, Windows автоматически запускает определенный PowerShell скрипт.

Прежде всего в Windows нужно настроить политику аудита процессов. На отдельном компьютере можно настроить политику аудита через редактор локальной GPO (gpedit.msc), если нужно настроить политику на компьютерах/серверах домена, воспользуйтесь доменным редактором gpmc.msc.

  1. Перейдите в раздел Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> Audit Policy;
  2. Откройте свойства политики Audit process tracking, включите ее для событий Success.
    политика аудита запуска процессов в windows (Audit process tracking)
  3. Обновите локальные политики: gpupdate /force

Теперь при запуске любого процесса в Windows в журнале Event Viewer -> Windows Logs -> Security будет появляться событие с EventID 4688 (A new process has been created). В событии указано, кто запустил процесс (Account name), имя процесса (New Process Name) и имя родительского процесса (Creator Process Name).

событие в event viewer EventID 4688 (A new process has been created).

Вы можете сделать выборку событий запуска программы из журнала событий по определенному процессу с помощью 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*”}

В результате мы получили таблицу с указанием пользователей, которые запускали определённую программу.

powershell скрипт для получения времени запуска программ и пользователей, которые их запускали

Теперь нужно создать задание планировщика, которое должно запускаться при появлении события 4688.

  1. Запустите Task Sheduler (taskschd.msc) и создайте новое задание -> Create Task;
  2. Укажите имя задания и укажите, что оно должно запускаться для всех пользователей (When running the task, use the following user account -> BUILTIN\Users). Если вы создаете задание планировщика через GPO, используйте формат %LogonDomain%\%LogonUser%;
    создать задание планировщика
  3. На вкладке Actions задайте действие, которое вы хотите выполнить. В этом примере я запускаю PowerShell скрипт (вызываем программу powershell.exe с атрибутами -ExecutionPolicy Bypass -file "C:\PS\ProcessRun.ps1»
    запуск powershell скрипта из task sheduler
  4. Теперь нужно привязать задание планировщика к событию Windows. Перейдите на вкладку Trigger -> New -> On an event -> Custom -> New Event Filter;
    создать тригер для event viewer (New Event Filter)
  5. В открывшемся окне нужно указать следующие параметры фильтра событий:

    Event logs: Security
    Event ID: 4688
    Keywords: Audit Success
    привязать задание к событию windows

  6. Теперь перейдите на вкладку XML и включите опцию Edit query manually. Отредактируйте запрос, добавив в фильтр строку: and *[EventData[Data[@Name='NewProcessName'] and (Data='C:\Windows\System32\notepad.exe')]]
  7. Должен получится такой 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>

    xml запрос для отслеживания события запуска процесса

  8. Сохраните задание планировщика.

Попробуйте теперь запустить процесс notepad.exe. Теперь каждый раз, когда пользователь запускает блокнот, выполняется ваш PowerShell скрипт.

выполнить powershell скрипта при запуске программы

В этом примере я через PowerShell вывожу всплывающее уведомление Windows. Вы можете использовать любой другой PowerShell скрипт — например отправку письма, что угодно.

Если вам нужно отслеживать завершение какой-то программы, используйте Event ID 4689 — A process has exited. После завершения программы иногда бывает нужно запустить скрипт резервного копирования и т.д.

Ранее мы рассматривали PowerShell скрипт для автоматического перезапуска процесса в случае его остановки. Решение с отслеживанием события запуска/остановки процессов более элегантное и не требует наличия запущенного скрипта PowerShell для мониторинга работающих процессов.


Предыдущая статья Следующая статья


Комментариев: 6 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)