Udostępnij za pośrednictwem


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

  1. 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).

  2. 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.

  3. Utwórz wystąpienie __FilterToConsumerBinding, aby skojarzyć filtr z wystąpieniem NTEventLogEventConsumer.

  4. 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

  1. Skopiuj poniższą listę MOF do pliku tekstowego i zapisz go przy użyciu rozszerzenia mof.

  2. W oknie Polecenia skompiluj plik MOF przy użyciu następującego polecenia:

    mofcomp nazwa pliku**.mof**

  3. Uruchom Eventvwr.exe. Przyjrzyj się dziennikowi zdarzeń aplikacji. Powinno zostać wyświetlone zdarzenie o identyfikatorze = 10 (EventID), Source = "WMI" i Type = Error.

  4. 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";
};

monitorowanie zdarzeń i reagowanie na nie za pomocą standardowych użytkowników