Rejestrowanie w dzienniku zdarzeń NT na bazie zdarzenia
Klasa NTEventLogEventConsumer zapisuje komunikat w dzienniku zdarzeń systemu Windows po wystąpieniu określonego zdarzenia. Ta klasa jest standardowym odbiorcą zdarzeń zapewnianym przez usługę WMI.
Notatka
Uwierzytelnieni użytkownicy nie mogą domyślnie rejestrować zdarzeń w dzienniku aplikacji na komputerze zdalnym. W związku z tym przykład opisany w tym temacie nie powiedzie się, jeśli użyjesz właściwości o nazwie UNCServerName klasy NTEventLogEventConsumer i jako wartość określisz komputer zdalny. Aby dowiedzieć się, jak zmienić zabezpieczenia dziennika zdarzeń, zapoznaj się z tym artykułem bazy wiedzy .
Podstawowa procedura użycia standardowego konsumenta jest opisana w Monitorowanie i reagowanie na zdarzenia za pomocą standardowych konsumentów. Poniżej przedstawiono dodatkowe kroki wykraczające poza podstawową procedurę wymaganą podczas korzystania z klasy NTEventLogEventConsumer. W krokach opisano sposób tworzenia odbiorcy zdarzeń, który zapisuje w dzienniku zdarzeń aplikacji.
Poniższa procedura opisuje, jak utworzyć odbiorcę zdarzeń zapisującego w dzienniku zdarzeń NT.
Aby utworzyć odbiorcę zdarzeń, który zapisuje w dzienniku zdarzeń systemu Windows
W pliku MOF (Managed Object Format) utwórz wystąpienie NTEventLogEventConsumer w celu odbierania żądanych zdarzeń w zapytaniu. Aby uzyskać więcej informacji na temat pisania kodu MOF, zobacz Projektowanie klas formatu obiektów zarządzanych (MOF).
Utwórz i nadaj nazwę wystąpieniu __EventFilter, a następnie utwórz zapytanie w celu określenia typu zdarzenia, które wyzwala zapisywanie w dzienniku zdarzeń NT.
Aby uzyskać więcej informacji, zobacz Querying with WQL.
Utwórz wystąpienie __FilterToConsumerBinding, aby skojarzyć filtr z wystąpieniem NTEventLogEventConsumer.
Skompiluj plik MOF przy użyciu Mofcomp.exe.
Przykład
Przykład w tej sekcji jest w kodzie MOF, ale wystąpienia można utworzyć programowo przy użyciu API skryptowego dla WMI lub API COM dla WMI. W przykładzie pokazano, jak utworzyć odbiorcę do zapisywania w dzienniku zdarzeń aplikacji przy użyciu NTEventLogEventConsumer. MoF tworzy nową klasę o nazwie "NTLogCons_Example", filtr zdarzeń do wykonywania zapytań dotyczących operacji, takich jak tworzenie, w wystąpieniu tej nowej klasy oraz powiązanie między filtrem a użytkownikiem. Ponieważ ostatnią akcją w MOF jest utworzenie wystąpienia NTLogCons_Example, możesz natychmiast zobaczyć zdarzenie w dzienniku zdarzeń aplikacji, uruchamiając Eventvwr.exe.
EventID=0x0A for SourceName="WinMgmt"
identyfikuje komunikat z następującym tekstem. "Tzw. „%1”, „%2”, „%3” są symbolami używanymi dla odpowiadających im ciągów określonych w tablicy 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.
W poniższej procedurze opisano sposób użycia przykładu.
Aby użyć przykładowego
Skopiuj poniższą listę MOF do pliku tekstowego i zapisz go przy użyciu rozszerzenia mof.
W oknie Polecenia skompiluj plik MOF przy użyciu następującego polecenia:
mofcomp nazwa pliku**.mof**
Uruchom Eventvwr.exe. Przyjrzyj się dziennikowi zdarzeń aplikacji. Powinno zostać wyświetlone zdarzenie o identyfikatorze = 10 (EventID), Source = "WMI" i Type = Error.
Kliknij dwukrotnie komunikat typu informacji z usługi WMI z wartością 10 w kolumnie zdarzeń . Dla zdarzenia zostanie wyświetlony następujący opis.
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";
};
Tematy pokrewne