Поддержка событий — одна из превосходных особенностей ОС Windows. Всякий раз, когда в операционной системе что-то происходит, она инициирует событие. Приложения могут подписываться на уведомления о конкретных событиях и реагировать на них, например выполнением определенных действий. В частности, при щелчке кнопки в диалоговом окне приложение может получать уведомление о событии «щелчок кнопки» и выполнять все предназначенные для этого события действия.
Инициировать события способна также служба Windows Management Instrumentation (WMI), и можно подписать Windows PowerShell версии 2 для получения этих событий. После этого можно задействовать Windows PowerShell для выполнения любых команд, которые должны выполняться в ответ на эти события. Обычно WMI порождает одно из довольно ограниченного числа событий, но это может происходить в одном из огромного количества различных классов WMI.
Существуют три ключевых момента использования событий WMI:
- понимание, какое событие требуется отслеживать
- понимание класса требуемого события
- использование командлета Register-WmiEvent для подписки на уведомления о событиях
Простые события
Инициировать события могут некоторые классы WMI. Например, класс Win32_ProcessStartTrace инициирует события в момент запуска процесса. Он делает то же самое в других ситуациях. Когда инициируется событие создания нового процесса, в качестве идентификатора источника оно содержит «Process Started». Для подписки на события необходимо выполнить следующую команду:
Register-WmiEvent –class "Win32_ProcessStartTrace"
–sourceIdentifier "Process Started"
Конечно, простая информация о запуске процесса не очень полезна. Скорее всего потребуется определить какие-то действия для регистрации процесса в журнале, отправки сообщения по электронной почте или даже завершения процесса.
Выполните командлет Get-EventSubscriber, чтобы увидеть только что созданную подписку на уведомления о событии. Чтобы удалить все подписки на события, выполните команду Get-EventSubscriber | Unregister-Event. Также можно задействовать командлет Unregister-Event, чтобы удалить подписку по ее идентификационному номеру.
Полезные события
WMI может инициировать и намного более полезные события системного уровня. Например, событие __instancecreationevent инициируется всякий раз, когда создается новый экземпляр класса WMI, а событие __instancedeletionevent — при удалении экземпляра. Это может показаться не совсем полезным, но только подумайте:почти каждый элемент операционной системы и компьютерного оборудования представлен некоторым экземпляром класса WMI. Например, при подключении съемных устройств хранения данных создается новый экземпляр класса Win32_LogicalDisk. А при завершении процесса удаляется экземпляр класса Win32_Process.
Хотите отобразить на экране сообщение, когда пользователь подключит внешний USB-диск?
Register-wmievent –query "select * from __instancecreationevent within 5 where targetinstance isa 'win32_logicaldisk'" –action { Write "You had better not put any proprietary information on that!" }
Этот непростой запрос, поэтому поясним, что он делает:
- SELECT * FROM __instancecreationevent (кстати, в названии события два подчеркивания) просто указывает, что нужно получить все свойства данного события;
- WITHIN 5 означает, что надо проверять события каждые 5 секунд. Не задавайте слишком малое число, иначе слишком много вычислительных мощностей будет тратиться на постоянную проверку обновлений;
- WHERE TARGET INSTANCE ISA 'Win32_LogicalDisk' сообщает WMI, что нужны только события создания нового экземпляра класса Win32_LogicalDisk.
Наконец, параметр –action является заключенным в фигурные скобки блоком сценария, который содержит действия, которые нужно выполнить при возникновении данного события.
Использование параметра –computerName для подписки на события, которые происходят на удаленном компьютере, — это такая особая уловка. Это связано с тем, что необходимо иметь права локального администратора на удаленном компьютере, а само действие происходить на локальном компьютере.
Кстати, не поддавайтесь соблазну подписаться на события создания экземпляра класса CIM_DataFile, который представляет файлы на диске. Служба WMI не очень эффективна для мониторинга создания новых файлов. Скорее всего события будут теряться, а попытки перехватить все события могут создать довольно существенную нагрузку на систему.
Предостережения и уловки
Конечно, реагирование на события будет продолжаться, пока работает оболочка. При закрытии оболочки или при прекращении ее работы по каким-то иными причинам, регистрация событий прекращается.
Это делает события WMI несколько менее полезными для использования на компьютерах пользователей, поскольку вряд ли PowerShell будет всегда работать на каждом компьютере. Однако это очень полезный прием для мониторинга процессов и других компонентов на серверах, где существует больше возможностей для контроля.
Из блока сценария –action есть доступ к автоматической переменной $args, которая содержит все аргументы, передаваемые от события. Используйте Write $args в блоке сценария –action, чтобы увидеть, какие аргументы есть у данного события WMI.
Подробнее о событиях WMI и связанных с ними командах можно прочитать на странице TechNet..
Связанные материалы