Запуск 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 "2011-08-29T21: 24: 03ZC: \ temp \ Some Test File.txtSuccess"

Крок 2: Створюємо нове завдання в консолі журналу перегляду подій, за допомогою контекстного меню "Прикріпити завдання до даної події ("Attach Task to This Event... ")

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

Примітка. Можливості створення тригерів подій за допомогою цього меню раніше розглядалися в статті Тригери подій Windows.

Створіть завдання на запуск програми ( "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), які необхідно передати. Параметри події, представлені нижче, найбільш часто використовуються для ідентифікації події. Зауважимо, що весь вузол і його дочірні елементи необхідно додати в гілку EventTrigger.


Event / System / Channel
Event / System / EventRecordID
Event / System / Level

Ось так:

З командного рядка запустіть наступні команди для видалення завдання планувальника і перевтілення її за допомогою тільки що модифікованого файлу (я не знаю способу модифікувати завдання з використанням зміненого 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 "* [System [(EventRecordID = $ eventRecordID)]]"
[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 "2011-08-29T21: 24: 03ZC: \ temp \ Some Test File.txtSuccess"

Ви повинні побачити таке спливаюче вікно повідомлення:

Чи не спрацювало? Перевіряємо наступне:

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