Journalisation dans le journal des événements NT basée sur un événement
La classe NTEventLogEventConsumer écrit un message dans le journal des événements Windows lorsqu’un événement spécifié se produit. Cette classe est un consommateur d’événements standard fourni par WMI.
Remarque
Les utilisateurs authentifiés ne peuvent pas, par défaut, consigner des événements dans le journal des applications sur un ordinateur distant. En conséquence, l’exemple décrit dans cette rubrique échouera si vous utilisez la propriété UNCServerName de la classe NTEventLogEventConsumer et spécifiez un ordinateur distant comme sa valeur. Pour savoir comment modifier la sécurité du journal des événements, consultez cet article de la base de connaissances (KB).
La procédure de base pour utiliser un consommateur standard est décrite dans Surveillance et réponse aux événements avec des consommateurs standard. Les étapes suivantes sont des étapes supplémentaires au-delà de la procédure de base, nécessaires lors de l’utilisation de la classe NTEventLogEventConsumer. Les étapes décrivent comment créer un consommateur d’événements qui écrit dans le journal des événements de l’application.
La procédure suivante décrit comment créer un consommateur d’événements qui écrit dans le journal des événements NT.
Pour créer un consommateur d’événements qui écrit dans le journal des événements Windows
Dans un fichier Managed Object Format (MOF), créez une instance de NTEventLogEventConsumer pour recevoir les événements que vous demandez dans la requête. Pour plus d’informations sur l’écriture de code MOF, consultez Conception de classes Managed Object Format (MOF).
Créez, et nommez, une instance de __EventFilter, puis créez une requête pour spécifier le type d’événement qui déclenche l’écriture dans le journal des événements NT.
Pour plus d’informations, consultez Requêtes avec WQL.
Créez une instance de __FilterToConsumerBinding pour associer le filtre à l’instance de NTEventLogEventConsumer.
Compilez le fichier MOF en utilisant Mofcomp.exe.
Exemple
L’exemple dans cette section est en code MOF, mais vous pouvez créer les instances de manière programmatique en utilisant l’API de script pour WMI ou l’API COM pour WMI. L’exemple montre comment créer un consommateur pour écrire dans le journal des événements de l’application en utilisant NTEventLogEventConsumer. Le MOF crée une nouvelle classe nommée « NTLogCons_Example », un filtre d’événements pour interroger les opérations, telles que la création, sur une instance de cette nouvelle classe, et une liaison entre le filtre et le consommateur. Comme la dernière action dans le MOF est de créer une instance de NTLogCons_Example, vous pouvez immédiatement voir l’événement dans le journal des événements de l’application en exécutant Eventvwr.exe.
Le EventID=0x0A for SourceName="WinMgmt"
identifie un message avec le texte suivant. Les « %1 », « %2 », « %3 » sont des espaces réservés pour les chaînes correspondantes spécifiées dans le tableau 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.
La procédure suivante décrit comment utiliser l’exemple.
Pour utiliser l’exemple
Copiez la liste MOF ci-dessous dans un fichier texte et enregistrez-le avec une extension .mof.
Dans une fenêtre de commande, compilez le fichier MOF en utilisant la commande suivante :
Mofcomp nomdefichier**.mof**
Exécutez Eventvwr.exe. Regardez le journal des événements de l’application. Vous devriez voir un événement avec ID = 10 (l’EventID), Source = « WMI », et Type = Erreur.
Double-cliquez sur le message de type Information de WMI avec 10 dans la colonne Événement. La description suivante sera affichée pour l’événement.
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";
};
Rubriques connexes