Запланируйте задачу для мониторинга запуска определенного процесса

Я пытаюсь связать два приложения вместе, чтобы при запуске одного запускалось и другое.

Я ожидал найти это в планировщике заданий в разделе «События»> «Приложение» или что-то в этом роде, но только некоторые приложения имеют там источники событий.

Поэтому я исследовал и обнаружил, что вы можете обнаружить запуск процесса, зарегистрировав событие WMI.

Register-WMIEvent -Query "SELECT * FROM __InstanceCreationEvent WITHIN 3 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = 'notepad.exe'" -sourceIdentifier 'NotepadStarted' -action {if(!(ps AutoHotKey)) { start Automator.ahk}}

Однако это предназначено для постоянной работы, что означает процесс powershell.exe в фоновом режиме и опрос WMI каждые 3 секунды (WITHIN 3 - да, мне нужно, чтобы он ответил как можно скорее). ПК и без того достаточно мощный для этой работы, но если в будущем я захочу смотреть более одного приложения, этот подход может потребовать слишком много ресурсов.

Есть ли лучший способ наблюдать за запуском процесса в Windows? Без постоянного опроса или запуска скрипта в фоновом режиме, а просто планирования задачи для ответа на событие запуска Блокнота?


person Leeroy    schedule 29.10.2015    source источник


Ответы (1)


Я нашел способ через Аудит, который, похоже, работает нормально. Мы пытаемся заставить процесс вызывать событие при его запуске, а затем в планировщике заданий использовать это событие в качестве триггера для нашего действия.

ОБНОВЛЕНИЕ: Сиамские близнецы — действия приложения в стиле IFTTT с использованием аудита и запланированных задач в Windows . Это сценарий Powershell, который поможет вам настроить это.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: ОК, это дает несколько ложных срабатываний. Действие может запускаться без фактического выполнения программы. Так что будьте осторожны.

Перейдите к своему application.exe, щелкните правой кнопкой мыши> Свойства> вкладка «Безопасность»> «Дополнения»> вкладка «Аудит»> «Изменить».

Добавьте свое имя пользователя и установите флажок Перейти к папке/выполнить файл. Нажмите все ОК. Каждое успешное выполнение application.exe теперь будет отображаться в средстве просмотра событий. Зайдите туда, чтобы проверить их:

Просмотр событий> Журналы Windows> Безопасность. Вы можете отфильтровать текущий журнал для EventID 4663.

Вот такое событие с моей машины:

Предпринята попытка доступа к объекту.

Subject:
  Security ID:    PC\Redacted
  Account Name:   Redacted
  Account Domain:   PC
  Logon ID:   0xxxxxxx

Object:
  Object Server:  Security
  Object Type:  File
  Object Name:  C:\Program Files\Some Application\application.exe
  Handle ID:  0x1e1c

Process Information:
  Process ID: 0x374
  Process Name: C:\Windows\explorer.exe

Access Request Information:
  Accesses: Execute/Traverse

  Access Mask:  0x20

Вы увидите более одного из них, это не просто один к одному, 1 запуск программы = 1 событие. Также есть события A handle was open, A handle was close.
В Планировщике заданий теперь вам нужно создать событие для запуска программы.

Создать новую задачу > Вкладка «Триггеры» > Создать

В раскрывающемся списке выберите Начать задачу: по событию.

Нажмите кнопку-переключатель Пользовательский, а затем кнопку Редактировать фильтр событий....

На вкладке XML установите флажок Редактировать запрос вручную и вставьте что-то вроде этого в:

<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">*[EventData[Data[@Name='ObjectName'] and (Data='C:\Program Files\Some Application\application.exe')]]
  </Select>
  </Query>
</QueryList>

¹
Изображения и дополнительные сведения см. на странице
Quick Советы по разработке: как отслеживать папку и запускать действие для входящих файлов в Windows 7

Когда это будет сделано, останется только настроить Действие, программу, которую вы хотите запускать при запуске application.exe. Для меня это был скрипт AutoHotKey — я просто нажал «Обзор» и перешел к нему.

Теперь, когда я запускаю приложение, я получаю этот скрипт AutoHotKey, автоматизирующий некоторые начальные шаги. Просто создать пакетный файл с application.exe & script.ahk в нем не получится, потому что иногда приложение запускается с открытия файла, иногда оно запускается чем-то еще, или кто знает. Таким образом, независимо от того, как он запускается, script.ahk происходит.

¹ Примечание: есть одна загвоздка. Этот запрос XPath работает для Data='C:\no\wildcards\allowed.exe', но вы будете разочарованы, обнаружив, что вы не может использовать подстановочные знаки или любые другие типы соответствия. Поэтому, если вы хотите выбрать файл, который не перемещается и не меняет имя, это нормально. Но если вы хотите выбрать только что созданный файл с неизвестным именем внутри папки, которую вы просматриваете, вы не сможете. В лучшем случае вы можете сделать Data='variant1' OR Data='variant2'...

person Leeroy    schedule 29.10.2015