В этой статье мы рассмотрим, как отследить событие запуска определённой программы (процесса) в Windows и выполнить какое-то действие (запустить скрипт, отправить email и т.д.). В качестве примера мы будем отслеживать запуск процесса
notepad.exe
, когда пользователь открывает эту программу, Windows автоматически запускает определенный PowerShell скрипт.
Прежде всего в Windows нужно настроить политику аудита процессов. На отдельном компьютере можно настроить политику аудита через редактор локальной GPO (
gpedit.msc
), если нужно настроить политику на компьютерах/серверах домена, воспользуйтесь доменным редактором
gpmc.msc
.
- Перейдите в раздел Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> Audit Policy;
- Откройте свойства политики Audit process tracking, включите ее для событий Success.
- Обновите локальные политики:
gpupdate /force
Теперь при запуске любого процесса в Windows в журнале Event Viewer -> Windows Logs -> Security будет появляться событие с EventID 4688 (A new process has been created). В событии указано, кто запустил процесс (
Account name
), имя процесса (
New Process Name
) и имя родительского процесса (
Creator Process Name
).
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*”}
В результате мы получили таблицу с указанием пользователей, которые запускали определённую программу.
Теперь нужно создать задание планировщика, которое должно запускаться при появлении события 4688.
- Запустите Task Sheduler (
taskschd.msc
) и создайте новое задание -> Create Task; - Укажите имя задания и укажите, что оно должно запускаться для всех пользователей (When running the task, use the following user account -> BUILTIN\Users). Если вы создаете задание планировщика через GPO, используйте формат
%LogonDomain%\%LogonUser%
; - На вкладке Actions задайте действие, которое вы хотите выполнить. В этом примере я запускаю PowerShell скрипт (вызываем программу
powershell.exe
с атрибутами-ExecutionPolicy Bypass -file "C:\PS\ProcessRun.ps1
» - Теперь нужно привязать задание планировщика к событию Windows. Перейдите на вкладку Trigger -> New -> On an event -> Custom -> New Event Filter;
- В открывшемся окне нужно указать следующие параметры фильтра событий:Event logs:
Security
Event ID:4688
Keywords:Audit Success
- Теперь перейдите на вкладку XML и включите опцию Edit query manually. Отредактируйте запрос, добавив в фильтр строку:
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 вывожу всплывающее уведомление Windows. Вы можете использовать любой другой PowerShell скрипт — например отправку письма, что угодно.
Ранее мы рассматривали PowerShell скрипт для автоматического перезапуска процесса в случае его остановки. Решение с отслеживанием события запуска/остановки процессов более элегантное и не требует наличия запущенного скрипта PowerShell для мониторинга работающих процессов.
Спасибо за пример.
Всем здравствуйте.
Помогите настроить подобный скрипт…
Пользую программы «TunnelBear» и «utorrent-2.2.0». Есть необходимость , что б при активации/запуске «TunnelBear» производился выход (или приостановка ВСЕГО трафика) из «utorrent-2.2.0» и наоборот при закрытии (выходе) из «TunnelBear» автоматически запускался «utorrent-2.2.0». Как можно реализовать сию идею? Через планировщик? Через командную строку? Может в ярлыках что нужно прописать? А может вообще скрипт какой нужен?
Спасибо.
В статье подробно все описано. Следуйте инструкции и все получится. Прсто замените процессы на свои. Если написанное тут для вас непонятно, врядли вам получится помочь в рамках комментариев.
Прошу прощения , но сия инструкция слишком
ненужнаядлинная и заморочистая для решения моего ПРОСТОГО, как выяснилось, вопроса, серьёзно. Достаточно было всего лишь 20 строк…Поделитесь этими строками?
Для закрытия одной конкретной программы я использую closetm.exe, правда для другой она не срабатывает (там в файле настроек нужно вводить заголовок закрываемого окна, который, видимо, отличается).
Еще есть pskill.exe из набора PSTools, но она, к сожалению, не убирает иконку в панели задач около часов после прибития процесса.
Поддерживаю! Строчки в студию!
Помимо 4689 в тексте фильтра нужно использовать «ProcessName» вместо «NewProcessName».
За статью спасибо, хотя лично мне удобнее было бы видеть названия элементов на русском вместо вот этого: «Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> Audit Policy»
Всем здравствуйте.
А как получить ID запущенного процесса? Т.е. фактически, как получить данные из текущего события, которое вызвало запуск скрипта в планировщике?
В самом событии есть ID процесса. Вам он нужен?
Здравствуйте! У меня код выглядит так(добавил только строку из пункта 6):
*[System[band(Keywords,9007199254740992) and (EventID=4688)]] and *[EventData[Data[@Name=’NewProcessName’] and (Data=’C:\AST_OFFICE\AstOffice.exe’)]]
Но почему то при запуске программы ничего не происходит.
Делал ВСЕ согласно данной инструкции
По пунктам 1 и 2, для тех у кого Windows не Pro (например, single language) можно добавить способ настройки через Powershell команду (запускать PS как администратор):
auditpol /set /subcategory:"Создание процесса"
Проверить установку можно
auditpol /get /subcategory:"Создание процесса"
Ответ должен быть «… Создание процесса Успех»
В принципе команда и для Pro версии выглядит проще, чем через графический интерфейс. Для английского вариант будет что-то типа «Process creation», если не ошибаюсь.
Т.е. не через PowerShell, а в обычном CMD это, но тоже под админом. Виноват.
Хотя что я извиняюсь, в PowerShell так тоже работает оказывается, и так оно правильнее (CMD уже по умолчанию просто так под админом не работает, насколько я помню, в целях безопасности).