Мониторинг и реагирование на события используя стандартных потребителей
Для выполнения действий на основе событий в операционной системе можно использовать стандартные классы потребителей . Стандартные потребители — это простые классы, которые уже зарегистрированы, и они определяют постоянные классы потребителей. Каждый стандартный потребитель принимает определенное действие после получения уведомления о событии. Например, можно определить экземпляр ActiveScriptEventConsumer для выполнения скрипта, если свободное место на компьютере отличается от указанного размера.
WMI компилирует стандартных потребителей в пространства имен по умолчанию, которые зависят от операционной системы, например:
- В Windows Server 2003 все стандартные потребители компилируются по умолчанию в пространство имен Root\Subscription.
Заметка
Пространства имен и операционные системы по умолчанию, относящиеся к каждому классу WMI, см. в разделах "Примечания и требования" каждого раздела класса.
В следующей таблице перечислены и описаны стандартные потребители WMI.
Стандартный потребитель | Описание |
---|---|
ActiveScriptEventConsumer | Выполняет скрипт при получении уведомления о событии. Дополнительные сведения см. в разделе Запуск скрипта на событии. |
Потребитель событий файла журнала | Записывает настраиваемые строки в текстовый файл журнала при получении уведомления о событии. Для получения дополнительной информации см. запись в файл журнала на основе события. |
NTEventLogEventConsumer | Записывает определенное сообщение в журнал событий приложения. Дополнительные сведения см. в разделе Ведение журнала событий в Журнал событий NT на основе события. |
SMTPEventConsumer | Отправляет сообщение электронной почты с помощью SMTP при каждой доставке события. Дополнительные сведения см. в разделе отправки электронной почты на основесобытия. |
CommandLineEventConsumer | Запускает процесс при доставке события в локальную систему. Исполняемый файл должен находиться в безопасном расположении или защищенном с помощью строгого списка управления доступом (ACL), чтобы запретить несанкционированному пользователю заменить исполняемый файл другим исполняемым файлом. Дополнительные сведения см. в разделе Запуск программы из командной строки на основе события. |
В следующей процедуре описывается мониторинг событий и реагирование на них с помощью стандартного потребителя. Обратите внимание, что процедура совпадает с файлом, скриптом или приложением в формате управляемого объекта (MOF).
Мониторинг и реагирование на события с помощью стандартного потребителя
Укажите namespace в MOF-файле с использованием команды препроцессора MOF #pragma namespace. В скрипте или приложении укажите пространство имен в коде, который подключается к WMI.
В следующем примере кода MOF показано, как указать пространство имен root\subscription.
#pragma namespace ("\\\\.\\root\\subscription")
Большинство встроенных событий связаны с изменениями экземпляров классов в пространстве имен root\cimv2. Однако события реестра, такие как RegistryKeyChangeEvent, запускаются в пространстве имен root\default поставщиком системного реестра .
Потребитель может включать классы событий, находящиеся в других пространствах имен, указав пространство имен в свойстве EventNamespace в запросе событий __EventFilter. Встроенные события классах, таких как __InstanceOperationEvent, доступны в каждом пространстве имен.
Создание и заполнение экземпляра стандартного класса потребителей.
Этот экземпляр может иметь уникальное значение в свойстве имени. Вы можете обновить существующего потребителя, используя то же самое имя.
InsertionStringTemplates содержит текст для вставки в событие, указанное в EventType. Можно использовать литеральные строки или ссылаться непосредственно на свойство. Дополнительные сведения см. в разделах Использование стандартных строковых шаблонов и инструкции SELECT для запросов событий.
Используйте существующий источник для журнала событий, поддерживающего строку вставки без связанного текста.
Пример следующего кода MOF показывает, как использовать существующий источник WSH и значение EventID равное 8.
instance of NTEventLogEventConsumer as $Consumer { Name = "RunKeyEventlogConsumer"; SourceName = "WSH"; EventID = 8; // Warning EventType = 2; // One string supplies the entire message NumberOfInsertionStrings = 1; // the %Hive% and %KeyPath% are properties of // the RegistryKeyChangeEvent instance InsertionStringTemplates = {"The key %Hive%\\%RootPath% has been modified." "Check if the change is intentional"}; };
Создайте экземпляр __EventFilter и определите запрос на события.
В следующем примере фильтр отслеживает раздел реестра, в котором регистрируются программы запуска. Мониторинг этого раздела реестра может быть важным, так как несанкционированная программа может зарегистрировать себя под ключом, что приводит к его запуску при загрузке компьютера.
instance of __EventFilter as $Filter { Name = "RunKeyFilter"; QueryLanguage = "WQL"; Query = "Select * from RegistryTreeChangeEvent" " where (Hive = \"HKEY_LOCAL_MACHINE\" and " "RootPath = \"Software\\\\Microsoft\\\\Windows" "\\\\CurrentVersion\\\\Run\")"; // RegistryTreeChangeEvents only fire in root\default namespace EventNamespace = "root\\default"; };
Определите событие для мониторинга и создайте запрос на событие.
Вы можете проверить, есть ли внутреннее или внешнее событие, которое используется. Например, используйте класс RegistryTreeChangeEvent поставщика реестра для отслеживания изменений в системный реестр.
Если отсутствует класс, который описывает событие, которое необходимо отслеживать, необходимо создать собственный сборщик событий и определить новые классы экзогенных событий. Дополнительные сведения см. в созданиипоставщика событий.
В MOF-файле вы можете определить псевдоним для фильтра и потребителя, который позволяет легко описать пути к экземплярам.
В следующем примере показано, как определить псевдоним для фильтра и потребителя.
instance of __EventFilter as $FILTER instance of LogFileEventConsumer as $CONSUMER
Создайте экземпляр __FilterToConsumerBinding для связывания фильтра и классов потребителей. Этот экземпляр определяет, что при возникновении события, соответствующего указанному фильтру, необходимо выполнить действие, указанное потребителем. __EventFilter, __EventConsumerи __FilterToConsumerBinding должны иметь один и тот же идентификатор безопасности (SID) в свойстве CreatorSID. Для получения дополнительной информации см. раздел Связывание фильтра событий с логическим потребителем.
В следующем примере показано, как определить экземпляр по пути объекта или использовать псевдоним в качестве сокращенного выражения для пути объекта.
instance of __EventFilter as $FILTER instance of NTEventLogEventConsumer as $CONSUMER
В следующем примере фильтр привязывается к потребителю с помощью псевдонимов.
instance of __FilterToConsumerBinding { Filter = $FILTER; Consumer = $CONSUMER; };
Вы можете привязать один фильтр к нескольким потребителям, что указывает на то, что при сопоставлении событий необходимо выполнить несколько действий; или можно привязать одного потребителя к нескольким фильтрам, что означает, что действие должно выполняться при возникновении событий, соответствующих одному из фильтров.
Следующие действия выполняются на основе условий потребителей и событий:
- Если один из постоянных потребителей завершается ошибкой, другие потребители, запрашивающие событие, получают уведомление.
- Если событие удалено, WMI запускает __EventDroppedEvent.
- При подписке на это событие возвращается событие, которое удаляется, а ссылка на __EventConsumer представляет несостоявшегося потребителя.
- Если при сбое потребителя WMI запускает событие __ConsumerFailureEvent, оно может содержать дополнительные сведения в свойствах ErrorCode, ErrorDescription и ErrorObject.
Дополнительные сведения см. в разделе Привязка фильтра событий к логическому потребителю.
Пример
В следующем примере показан MOF для экземпляра NTEventLogEventConsumer. После компиляции этого MOF любая попытка создать, удалить или изменить значение в пути реестра HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows\CurrentVersion\Run записывает запись в журнал событий приложения под исходным кодом WSH.
#pragma namespace ("\\\\.\\root\\subscription")
instance of __EventFilter as $Filter
{
Name = "RunKeyFilter";
QueryLanguage = "WQL";
Query = "Select * from RegistryTreeChangeEvent"
" where (Hive = \"HKEY_LOCAL_MACHINE\" and "
"KeyPath = \"Software\\\\Microsoft\\\\Windows"
"\\\\CurrentVersion\\\\Run\")";
// RegistryTreeChangeEvents only fire
// in root\default namespace
EventNamespace = "root\\default";
};
instance of NTEventLogEventConsumer as $Consumer
{
Name = "RunKeyEventlogConsumer";
SourceName = "WSH";
EventID = 8;
EventType = 2; // Warning
Category = 0;
NumberOfInsertionStrings = 1;
// the %Hive% and %KeyPath% are properties
// of the RegistryKeyChangeEvent instance
InsertionStringTemplates = {"The key %Hive%\\%RootPath% "
"has been modified. Check if the change is intentional"};
};
// Bind the filter to the consumer
instance of __FilterToConsumerBinding
{
Filter = $Filter;
Consumer = $Consumer;
};
Связанные разделы