Запись в журнал событий NT на основании произошедшего события
Класс NTEventLogEventConsumer записывает сообщение в журнал событий Windows при возникновении указанного события. Этот класс является стандартным потребителем событий, который предоставляет WMI.
Примечание.
Пользователи, прошедшие проверку подлинности, по умолчанию не могут регистрировать события журнала приложения на удаленном компьютере. В результате пример, описанный в этом разделе, завершится сбоем, если вы используете свойство UNCServerName класса NTEventLogEventConsumer и укажите удаленный компьютер в качестве значения. Чтобы узнать, как изменить безопасность журнала событий, ознакомьтесь с этой статьей базы знаний.
Базовая процедура использования стандартного потребителя описана в разделе "Мониторинг и реагирование на события с помощью стандартных потребителей". Ниже приведены дополнительные шаги, выходящие за рамки базовой процедуры, необходимые при использовании класса NTEventLogEventConsumer. Шаги описывают, как создать потребителя событий, который записывает в журнал событий приложения.
В следующей процедуре описывается создание потребителя событий, который записывает в журнал событий NT.
Создать потребителя событий, который записывает в журнал событий Windows
В файле формата управляемых объектов (MOF) создайте экземпляр NTEventLogEventConsumer для получения событий, которые вы запросили. Дополнительные сведения о написании кода MOF см. в разделе "Проектирование классов управляемого формата объектов (MOF).
Создайте и укажите имя экземпляра __EventFilter, а затем создайте запрос, чтобы указать тип события, который активирует запись в журнал событий NT.
Дополнительные сведения см. в статье "Запросы с помощью WQL".
Создайте экземпляр __FilterToConsumerBinding для связывания фильтра с экземпляром NTEventLogEventConsumer.
Скомпилируйте 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.
В следующей процедуре описывается, как использовать пример.
Использование примера
Скопируйте приведенный ниже список MOF в текстовый файл и сохраните его с расширением MOF.
В командном окне скомпилируйте MOF-файл с помощью следующей команды:
Mofcompfilename**.mof**
Запустите Eventvwr.exe. Просмотрите журнал событий приложения. Должно появиться событие с идентификатором = 10 (EventID), Source = "WMI" и Type = Error.
Дважды щелкните сообщение типа Информация из 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";
};
Связанные темы