Поделиться через


Мониторинг и реагирование на события используя стандартных потребителей

Для выполнения действий на основе событий в операционной системе можно использовать стандартные классы потребителей . Стандартные потребители — это простые классы, которые уже зарегистрированы, и они определяют постоянные классы потребителей. Каждый стандартный потребитель принимает определенное действие после получения уведомления о событии. Например, можно определить экземпляр ActiveScriptEventConsumer для выполнения скрипта, если свободное место на компьютере отличается от указанного размера.

WMI компилирует стандартных потребителей в пространства имен по умолчанию, которые зависят от операционной системы, например:

  • В Windows Server 2003 все стандартные потребители компилируются по умолчанию в пространство имен Root\Subscription.

Заметка

Пространства имен и операционные системы по умолчанию, относящиеся к каждому классу WMI, см. в разделах "Примечания и требования" каждого раздела класса.

 

В следующей таблице перечислены и описаны стандартные потребители WMI.

Стандартный потребитель Описание
ActiveScriptEventConsumer Выполняет скрипт при получении уведомления о событии. Дополнительные сведения см. в разделе Запуск скрипта на событии.
Потребитель событий файла журнала Записывает настраиваемые строки в текстовый файл журнала при получении уведомления о событии. Для получения дополнительной информации см. запись в файл журнала на основе события.
NTEventLogEventConsumer Записывает определенное сообщение в журнал событий приложения. Дополнительные сведения см. в разделе Ведение журнала событий в Журнал событий NT на основе события.
SMTPEventConsumer Отправляет сообщение электронной почты с помощью SMTP при каждой доставке события. Дополнительные сведения см. в разделе отправки электронной почты на основесобытия.
CommandLineEventConsumer Запускает процесс при доставке события в локальную систему. Исполняемый файл должен находиться в безопасном расположении или защищенном с помощью строгого списка управления доступом (ACL), чтобы запретить несанкционированному пользователю заменить исполняемый файл другим исполняемым файлом. Дополнительные сведения см. в разделе Запуск программы из командной строки на основе события.

 

В следующей процедуре описывается мониторинг событий и реагирование на них с помощью стандартного потребителя. Обратите внимание, что процедура совпадает с файлом, скриптом или приложением в формате управляемого объекта (MOF).

Мониторинг и реагирование на события с помощью стандартного потребителя

  1. Укажите namespace в MOF-файле с использованием команды препроцессора MOF #pragma namespace. В скрипте или приложении укажите пространство имен в коде, который подключается к WMI.

    В следующем примере кода MOF показано, как указать пространство имен root\subscription.

    #pragma namespace ("\\\\.\\root\\subscription")
    

    Большинство встроенных событий связаны с изменениями экземпляров классов в пространстве имен root\cimv2. Однако события реестра, такие как RegistryKeyChangeEvent, запускаются в пространстве имен root\default поставщиком системного реестра .

    Потребитель может включать классы событий, находящиеся в других пространствах имен, указав пространство имен в свойстве EventNamespace в запросе событий __EventFilter. Встроенные события классах, таких как __InstanceOperationEvent, доступны в каждом пространстве имен.

  2. Создание и заполнение экземпляра стандартного класса потребителей.

    Этот экземпляр может иметь уникальное значение в свойстве имени. Вы можете обновить существующего потребителя, используя то же самое имя.

    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"};
    };
    
  3. Создайте экземпляр __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";                       
    };
    
  4. Определите событие для мониторинга и создайте запрос на событие.

    Вы можете проверить, есть ли внутреннее или внешнее событие, которое используется. Например, используйте класс RegistryTreeChangeEvent поставщика реестра для отслеживания изменений в системный реестр.

    Если отсутствует класс, который описывает событие, которое необходимо отслеживать, необходимо создать собственный сборщик событий и определить новые классы экзогенных событий. Дополнительные сведения см. в созданиипоставщика событий.

    В MOF-файле вы можете определить псевдоним для фильтра и потребителя, который позволяет легко описать пути к экземплярам.

    В следующем примере показано, как определить псевдоним для фильтра и потребителя.

    instance of __EventFilter as $FILTER
    instance of LogFileEventConsumer as $CONSUMER
    
  5. Создайте экземпляр __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;
};

Безопасное получение событий