Мне пришлось столкнуться с необходимостью запускать 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…»
Создайте задачу на запуск программы (“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…«.
С помощью блокнота (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>
Вот так:
Из командной строки запустите следующие команды для удаления задания планировщика и пересоздания ее с помощью только что модифицированного файла (я не знаю способа модифицировать задания с использованием измененного 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, который вызывается заданием планировщика
# 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)
}
Шаг 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”).