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


Ведение журнала событий NT в зависимости от события

Класс NTEventLogEventConsumer записывает сообщение в журнал событий Windows при возникновении указанного события. Этот класс является стандартным потребителем событий, который предоставляет WMI.

Примечание.

Пользователи, прошедшие проверку подлинности, по умолчанию не могут регистрировать события журнала приложения на удаленном компьютере. В результате пример, описанный в этом разделе, завершится сбоем, если вы используете свойство UNCServerName класса NTEventLogEventConsumer и укажите удаленный компьютер в качестве значения. Чтобы узнать, как изменить безопасность журнала событий, ознакомьтесь с этой статьей базы знаний.

 

Базовая процедура использования стандартного потребителя описана в разделе "Мониторинг и реагирование на события с помощью стандартных потребителей". Ниже приведены дополнительные шаги, выходящие за рамки базовой процедуры, необходимые при использовании класса NTEventLogEventConsumer. В шагах описывается создание потребителя события, записываемого в журнал событий приложения.

В следующей процедуре описывается создание потребителя событий, записываемого в журнал событий NT.

Создание потребителя события, записываемого в журнал событий Windows

  1. В файле ФОРМАТА управляемых объектов (MOF) создайте экземпляр NTEventLogEventConsumer для получения событий, которые вы запрашиваете в запросе. Дополнительные сведения о написании кода MOF см. в разделе "Проектирование классов управляемого формата объектов (MOF).

  2. Создайте и укажите имя экземпляра __EventFilter, а затем создайте запрос, чтобы указать тип события, который активирует запись в журнал событий NT.

    Дополнительные сведения см. в статье "Запросы с помощью WQL".

  3. Создайте экземпляр __FilterToConsumerBinding для связывания фильтра с экземпляром NTEventLogEventConsumer.

  4. Скомпилируйте MOF-файл с помощью Mofcomp.exe.

Пример

Пример в этом разделе приведен в коде MOF, но вы можете создавать экземпляры программным способом с помощью API скриптов для WMI или COM-API для WMI. В примере показано, как создать потребителя для записи в журнал событий приложения с помощью NTEventLogEventConsumer. MOF создает новый класс с именем "NTLogCons_Example", фильтр событий для запроса операций, таких как создание, на экземпляре этого нового класса и привязка между фильтром и потребителем. Так как последнее действие в MOF заключается в создании экземпляра NTLogCons_Example, вы можете сразу увидеть событие в журнале событий приложения, выполнив Eventvwr.exe.

Идентифицирует EventID=0x0A for SourceName="WinMgmt" сообщение со следующим текстом. Заполнители "%1", "%2", "%3" для соответствующих строк, указанных в массиве InsertionStringTemplates.

Event filter with query "%2" could not be [re]activated in 
namespace "%1" because of error %3. Events may not be delivered 
through this filter until the problem is corrected.

В следующей процедуре описывается, как использовать пример.

Использование примера

  1. Скопируйте приведенный ниже список MOF в текстовый файл и сохраните его с расширением MOF.

  2. В командном окне скомпилируйте MOF-файл с помощью следующей команды:

    Mofcomp filename**.mof**

  3. Запустите Eventvwr.exe. Просмотрите журнал событий приложения. Должно появиться событие с идентификатором = 10 ( EventID), source = "WMI" и type = Error.

  4. Дважды щелкните сообщение типа сведений из WMI с 10 в столбце событий. Следующее описание будет отображаться для события.

    Event filter with query "STRING2" could not be [re]activated in 
    namespace "STRING1" because of error STRING3. Events cannot be 
    delivered through this filter until the problem is corrected.
    
// Set the namespace as root\subscription.
// The NTEventLogEventConsumer is already
// compiled in the root\subscription namespace. 

#pragma namespace ("\\\\.\\Root\\subscription")
class NTLogCons_Example
{
 [key] string name;
 string InsertionString;
};

// Create an instance of the NT Event log consumer
// and give it the alias $CONSUMER

instance of NTEventLogEventConsumer as $CONSUMER
{
    // Unique instance name
    Name = "NTConsumerTest"; 
    // System component that generates the event
    SourceName = "WinMgmt";
    // Event message WBEM_MC_CANNOT_ACTIVATE_FILTER
    EventID = 0xC000000A;
    // EVENTLOG_ERROR_TYPE
    EventType = 1;
    // WMI event messages do not have multiple categories
    Category = 0;
    // Number of strings in InsertionStringTemplates property
    NumberOfInsertionStrings = 3;

    InsertionStringTemplates =
       {"%TargetInstance.Name%",
        "%TargetInstance.InsertionString%",
        "STRING3"};
};

// Create an instance of the event filter
// and give it the alias $FILTER
// The filter queries for any instance operation event
// for instances of the NTLogCons_Example class

instance of __EventFilter as $FILTER
{
    // Unique instance name
    Name = "NTLogConsFilter";
    Query = "SELECT * from __InstanceOperationEvent"
            " WHERE TargetInstance ISA \"NTLogCons_Example\"";
    QueryLanguage = "WQL";
};

// Create an instance of the binding
// between filter and consumer instances.

instance of __FilterToConsumerBinding
{
    Consumer = $CONSUMER;
    Filter = $FILTER;
};

// Create an instance of this class right now. 

instance of NTLogCons_Example
{
   Name = "STRING1";
   InsertionString = "STRING2";
};

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