Condividi tramite


Registrazione nel registro eventi NT in base a un evento

La classe NTEventLogEventConsumer scrive un messaggio nel registro eventi di Windows quando si verifica un evento specificato. Questa classe è un consumer di eventi standard fornito da WMI.

Nota

Gli utenti autenticati non possono, per impostazione predefinita, registrare gli eventi nel registro applicazioni in un computer remoto. Di conseguenza, l'esempio descritto in questo argomento avrà esito negativo se si utilizza la proprietà UNCServerName della classe NTEventLogEventConsumer e si specifica un computer remoto come valore. Per informazioni su come modificare la sicurezza del registro eventi, vedere questo articolo della Knowledge Base.

 

La procedura di base per l'uso di un consumer standard è descritta in Monitoraggio e risposta agli eventi con consumer standard. Di seguito sono riportati passaggi aggiuntivi oltre la procedura di base, necessari quando si usa la classe NTEventLogEventConsumer. I passaggi descrivono come creare un consumer di eventi che scrive nel registro eventi dell'applicazione.

La procedura seguente descrive come creare un consumer di eventi che scrive nel registro eventi NT.

Per creare un consumer di eventi che scrive nel registro eventi di Windows

  1. In un file MOF (Managed Object Format) creare un'istanza di NTEventLogEventConsumer per ricevere gli eventi richiesti nella query. Per altre informazioni sulla scrittura di codice MOF, vedere Progettazione di classi MOF (Managed Object Format).

  2. Creare e assegnare un nome a un'istanza di __EventFilter e quindi creare una query per specificare il tipo di evento che attiva la scrittura nel registro eventi NT.

    Per altre informazioni, vedere Esecuzione di query con WQL.

  3. Creare un'istanza di __FilterToConsumerBinding per associare il filtro all'istanza di NTEventLogEventConsumer.

  4. Compilare il file MOF usando Mofcomp.exe.

Esempio

L'esempio in questa sezione si trova nel codice MOF, ma è possibile creare le istanze a livello di codice usando l'API di scripting per WMI o l'API COM per WMI. Nell'esempio viene illustrato come creare un consumer da scrivere nel registro eventi dell'applicazione usando NTEventLogEventConsumer. MOF crea una nuova classe denominata "NTLogCons_Example", un filtro eventi per eseguire una query per le operazioni, ad esempio la creazione, in un'istanza di questa nuova classe e un'associazione tra filtro e consumer. Poiché l'ultima azione nel file MOF consiste nel creare un'istanza di NTLogCons_Example, è possibile visualizzare immediatamente l'evento nel registro eventi dell'applicazione eseguendo Eventvwr.exe.

Identifica EventID=0x0A for SourceName="WinMgmt" un messaggio con il testo seguente. "%1", "%2", "%3" sono segnaposto per le stringhe corrispondenti specificate nella matrice InsertStringTemplates.

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.

La procedura seguente descrive come usare l'esempio.

Per usare l'esempio

  1. Copiare l'elenco MOF seguente in un file di testo e salvarlo con estensione mof.

  2. In una finestra di comando compilare il file MOF usando il comando seguente:

    Mofcomp filename**.mof**

  3. Eseguire Eventvwr.exe. Esaminare il registro eventi dell'applicazione. Verrà visualizzato un evento con ID = 10 ( EventID), Source = "WMI" e Type = Error.

  4. Fare doppio clic sul messaggio Tipo di informazioni da WMI con 10 nella colonna Evento . Per l'evento verrà visualizzata la descrizione seguente.

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

Monitoraggio e risposta agli eventi con consumer standard