Запуск PowerShell скрипта при возникновении определенного события

Мне пришлось столкнуться с необходимостью запускать PowerShell скрипты при возникновении определенного события (Windows Event) при организации DHCP failover. Однако, думаю, что применений может быть масса. Покопался в сети и нашел статью под названием Trigger a PowerShell Script from a Windows Event. (http://blogs.technet.com/b/wincat/archive/2011/08/25/trigger-a-powershell-script-from-a-windows-event.aspx). Предлагаю Вашему вниманию перевод данной статьи на русский язык.

Этот пример показывает, как сделать две вещи сразу. Запустить скрипт PowerShell при возникновении определенного события Windows Event, а ТАКЖЕ передать нужные параметры Event-а в запускаемый скрипт. Для примера будет использовано тестовое событие сгенерированное при помощи программы EventCreate из командной строки.

Предыстория: Этот сценарий был нужен для очистки определенной общей папки при возникновении специфического события (Windows Event). Событие записывалось после того как завершался процесс внесения «водяного знака» в определенный файл. Событие, используемое в этом примере повторяет формат стандартного события.

Будут показаны следующие шаги:

  • Ручное создание и переключение события
  • Использования консоли Просмотра Событий (Event Viewer)
  • Изменение запланированной задачи для передачи параметров события скрипту
  • Запуск и выполнение PowerShell скрипта
  • Проверка настроек

Шаг 1: Создание записи о событии с помощью EventCreate

C:\>eventcreate /T INFORMATION /SO SomeApplication /ID 1000 /L APPLICATION /D "<Params><Timestamp>2011-08-29T21:24:03Z</Timestamp><InputFile>C:\temp\Some Test File.txt</InputFile><Result>Success</Result></Params>"

Шаг 2: Создаем новое задание в консоли журнала просмотра событий, с помощью контекстного меню «Прикрепить задачу к данному событию (“Attach Task to This Event…”)

Запустите консоль Event Viewer (eventvwr.msc), найдите в журнале событий Windows Logs -> Application событие, созданное на предыдущем шаге. Щелкните по нему ПКМ и выберите меню «Attach Task to This Event…»

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

Attach Task to This EventСоздайте задачу на запуск программы (“Start a Program”) со следующими параметрами:

Программа/скрипт (Program/script): PowerShell.exe

Аргументы (Add arguments): .\TriggerScript.ps1 -eventRecordID $(eventRecordID) -eventChannel $(eventChannel)

Запуск в (Start in) (вам может понадобиться создать эту папку или указать на существующую папку): c:\temp

Параметры нового задания планировщика

Шаг 3: Изменение задачи для передачи деталей события (trigger event) и передача параметров в скрипт PowerShell

Внутри Планировщика Задач (Task Scheduler), выгрузите только что созданную задачу (как файл XML). Кликните правой кнопкой мыши на задачу «Application_SomeApplication_1000» в папке «Event Viewer Tasks», и выберите «Export…«. Экспорт задания в XML файл

С помощью блокнота (Notepad) или другого текстового редактора (желательно, чтобы редактор поддерживал редактирование Unicode, как Блокнот) добавим параметры события (Event parameters), которые необходимо передать. Параметры события, представленные ниже, наиболее часто используются для идентификации события. Заметим, что весь узел <ValueQueries> и его дочерние элементы необходимо добавить в ветку EventTrigger.

<ValueQueries>
<Value name="eventChannel">Event/System/Channel</Value>
<Value name="eventRecordID">Event/System/EventRecordID</Value>
<Value name="eventSeverity">Event/System/Level</Value>
</ValueQueries>

Вот так:

valuequeries-xml файл

Из командной строки запустите следующие команды для удаления задания планировщика и пересоздания ее с помощью только что модифицированного файла (я не знаю способа модифицировать задания с использованием измененного XML файла).

C:\>schtasks /delete /TN "Event Viewer Tasks\Application_SomeApplication_1000"
C:\>schtasks /create /TN "Event Viewer Tasks\Application_SomeApplication_1000" /XML Application_

SomeApplication_1000.xml

Шаг 4: Создание PowerShell скрипта TriggerScript.ps1, который вызывается заданием планировщика

Примечание. Показанный скрипт получает базовую информацию о задаче, которая его запустила. Затем скрипт опрашивает Windows Event Log для получения других деталей о событии. В нашем примере параметры передаются через XML, но может передаваться и любой другой текст, при условии, что скрипт сможет его правильно разобрать и воспринять. Кстати, параметр “eventRecordID”, который передается скрипту, не следует путать с eventID события. Значение eventRecordID это последовательный порядковый номер назначаемый всем событиям, когда они регистрируются в своем канале (Log’e). В дополнение, eventRecordIDs уникален для конкретного канала (Log’а).


# Script Name: TriggerScript.ps1
# Usage Example (use a valid ID found via Event Viewer XML view of an event): powershell .\TriggerScript.ps1 -eventRecordID 1 -eventChannel Application
#
# Create a fake event or testing with the following command (from an elevated command prompt):
# eventcreate /T INFORMATION /SO SomeApplication /ID 1000 /L APPLICATION /D "2011-08-29T21:24:03ZC:\temp\Some Test File.txtSuccess"
# Collects all named paramters (all others end up in $Args)
param($eventRecordID,$eventChannel)

$event = get-winevent -LogName $eventChannel -FilterXPath "<QueryList><Query Id='0' Path='$eventChannel'><Select Path='$eventChannel'>*[System[(EventRecordID=$eventRecordID)]]</Select></Query></QueryList>"
[xml]$eventParams = $event.Message
if ($eventParams.Params.TimeStamp) {
[datetime]$eventTimestamp = $eventParams.Params.TimeStamp
$eventFile = $eventParams.Params.InputFile
$popupObject = new-object -comobject wscript.shell
$popupObject.popup("RecordID: " + $eventRecordID + ", Channel: " + $eventChannel + ", Event Timestamp: " + $eventTimestamp + ", File: " + $eventFile)
}

Примечание: Помимо выполнения скрипта, задание планировщика может отобразить всплывающее окно или отправить e-mail. Отправка e-mail уведомлений полезна для оповещения о не частых событий в вашем окружении. Подобная задача, также может быть распространена через GPO (Group Policy Preferences).

Шаг 5: Проверка настроек с помощью генерирования нового события, аналогичному созданного в Шаге 1

C:\>eventcreate /T INFORMATION /SO SomeApplication /ID 1000 /L APPLICATION /D "<Params><Timestamp>2011-08-29T21:24:03Z</Timestamp><InputFile>C:\temp\Some Test File.txt</InputFile><Result>Success</Result></Params>"

Вы должны увидеть такое всплывающее окно сообщения:

Всплывающее окно с данными события

Не сработало? Проверяем следующее:

  • Проверьте наличие события в Event Viewer. Вам может понадобиться обновить просмотр через меню «Обновить» или кнопкой F5.
  • Вручную запустите скрипт с реальными параметрами и посмотрите на возможные ошибки (обратите внимание на комментарии в скрипте, с примерами применения). Пока скрипт является “не подписанным”, может потребоваться настроить PowerShell на запуск данного как не подписанного (см. PS> get-help about_Execution_Policies).
  • Убедитесь, что задача находится в Планировщике Заданий (Task Scheduler) в папке “Event Viewer Tasks” и посмотрите на историю выполнения задачи (“History”).

 


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


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

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

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

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