Surveillance des événements

Les administrateurs système peuvent utiliser WMI pour superviser les événements sur un réseau. Par exemple :

  • Un service s’arrête de façon inattendue.
  • Un serveur devient indisponible.
  • Un lecteur de disque atteint 80 % de sa capacité.
  • Les événements de sécurité sont signalés dans un journal des événements NT.

WMI prend en charge la détection des événements et leur remise aux consommateurs d’événements, car certains fournisseurs WMI sont des fournisseurs d’événements. Pour plus d’informations, consultez Réception d’un événement WMI.

Les consommateurs d’événements sont des applications ou des scripts qui demandent des notifications d’événements et qui effectuent des tâches lorsque des événements spécifiques se produisent. Vous pouvez créer des scripts ou des applications de supervision des événements qui surveillent temporairement à quels moments des événements se produisent. WMI fournit également un ensemble de fournisseurs d’événements permanents préinstallés et les classes de consommateur permanent qui vous permettent de superviser constamment les événements. Pour plus d’informations, consultez Monitoring et réponse aux événements avec des consommateurs standard.

Voici les sections qui sont abordées dans cette rubrique :

Utilisation de consommateurs d’événements temporaires

Les consommateurs d’événements temporaires sont des scripts ou des applications qui retournent les événements qui correspondent à une requête ou à un filtre d’événement. Les requêtes d’événements temporaires utilisent généralement IWbemServices::ExecNotificationQuery dans les applications C++ ou SWbemServices.ExecNotificationQuery dans les scripts et Visual Basic.

Une requête d’événement demande des instances d’une classe d’événements qui spécifie un certain type d’événement, par exemple Win32_ProcessTrace ou RegistryKeyChangeEvent.

L’exemple de code VBScript suivant demande une notification lorsqu’une instance de Win32_ProcessTrace est créée. Une instance de cette classe est générée lorsqu’un processus démarre ou s’arrête.

Pour exécuter le script, copiez-le dans un fichier nommé event.vbs, puis utilisez la ligne de commande suivante : cscript event.vbs. Vous pouvez voir la sortie du script en démarrant Notepad.exe ou tout autre processus. Le script s’arrête après que cinq processus ont démarré ou se sont arrêtés.

Ce script appelle SWbemServices.ExecNotificationQuery, qui est la version semi-synchrone de la méthode. Le script suivant propose un exemple de configuration d’un abonnement à un événement temporaire asynchrone par l’appel de SWbemServices.ExecNotificationQueryAsync. Pour plus d’informations, consultez Appel d’une méthode. Le script appelle SWbemEventSource.NextEvent pour obtenir et traiter tous les événements à mesure qu’ils arrivent. Enregistrez le script dans un fichier avec une extension .vbs et exécutez le script sur une ligne de commande en utilisant CScript : cscript file.vbs.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" _
    & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessTrace")

Wscript.Echo "Waiting for events ..."
i = 0
Do Until i=5
    Set objReceivedEvent = objEvents.NextEvent
    'report an event
    Wscript.Echo "Win32_ProcessTrace event occurred" & VBNewLine _
        & "Process Name = " _
            & objReceivedEvent.ProcessName & VBNewLine _
        & "Process ID = " _
            & objReceivedEvent.Processid & VBNewLine _
        & "Session ID = " & objReceivedEvent.SessionID 
i = i+ 1
Loop

Les consommateurs d’événements temporaires doivent être démarrés manuellement et ne doivent pas persister d’un redémarrage de WMI ou du système d’exploitation à l’autre. Un consommateur d’événements temporaire doit être en cours d’exécution pour pouvoir traiter les événements.

La procédure suivante explique comment créer un consommateur d’événements temporaire.

Pour créer un consommateur d’événements temporaire

  1. Choisissez le langage de programmation que vous allez utiliser.

    Le langage de programmation détermine l’API qui sera utilisée.

  2. Le codage d’une application de consommateur d’événements temporaire commence de la même façon que pour une application WMI.

    Les premières étapes du codage varient en fonction du langage de programmation. En règle générale, il convient d’ouvrir une session sur WMI et de configurer les paramètres de sécurité. Pour plus d’informations, consultez Création d’une application ou d’un script WMI.

  3. Définissez la requête d’événement que vous souhaitez utiliser.

    Pour obtenir certains types de données de performances, vous devrez peut-être utiliser les classes fournies par des fournisseurs hautes performances. Pour plus d’informations, consultez Supervision des données de performances, Détermination du type d’événement à recevoir et Interrogation avec WQL.

  4. Déterminez si vous souhaitez effectuer un appel asynchrone ou un appel semi-synchrone, puis choisissez la méthode d’API.

    Les appels asynchrones vous permettent d’éviter la contrainte liée à l’interrogation de données. Cependant, les appels semi-synchronisés offrent des performances similaires pour une sécurité accrue. Pour plus d’informations, consultez Appel d’une méthode.

  5. Effectuez l’appel de méthode asynchrone ou semi-synchrone et incluez une requête d’événement en tant que paramètre strQuery.

    Pour les applications C++, appelez les méthodes suivantes :

    Pour les scripts, appelez les méthodes suivantes :

  6. Écrivez le code pour traiter l’objet d’événement retourné.

    Pour les requêtes d’événements asynchrones, placez le code dans les différentes méthodes ou événements du récepteur d’objets. Pour les requêtes d’événements semi-synchrones, chaque objet est retourné à mesure qu’il est obtenu par WMI. Ainsi, le code doit se trouver dans la boucle qui gère chaque objet.

L’exemple de code de script suivant est une version asynchrone du script Win32_ProcessTrace. Le retour des opérations asynchrones étant immédiat, une boîte de dialogue maintient le script actif en attendant les événements.

Au lieu d’appeler SWbemEventSource.NextEvent pour recevoir chaque événement, le script dispose d’un gestionnaire d’événements pour l’événement SWbemSink OnObjectReady.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & _
    strComputer & "\root\CIMV2") 
Set EventSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync EventSink, _
    "SELECT * FROM Win32_ProcessTrace WITHIN 10"
WScript.Echo "Waiting for events..."

i = 0
While (True)
    Wscript.Sleep(1000)
Wend

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    Wscript.Echo "Win32_ProcessTrace event has occurred."
    i = i+1
    If i = 3 Then WScript.Quit 0 
End Sub

Notes

Un rappel asynchrone, tel que celui géré par la sous-routine SINK_OnObjectReady, permet à un utilisateur non authentifié de fournir des données au récepteur. Pour une sécurité renforcée, utilisez une communication semi-synchrone ou une communication synchrone. Pour plus d'informations, voir les rubriques suivantes :

 

Utilisation de consommateurs d’événements permanents

Un consommateur d’événements permanent s’exécute tant que son inscription n’est pas explicitement annulée, puis démarre lorsque WMI ou le système redémarre.

Un consommateur d’événements permanent est une combinaison de classes WMI, de filtres et d’objets COM sur un système.

La liste suivante identifie les éléments nécessaires pour créer un consommateur d’événements permanent :

  • Un objet COM contenant le code qui implémente le consommateur permanent.
  • Une nouvelle classe de consommateur permanent.
  • Une instance de la classe consommateur permanent.
  • Un filtre contenant la requête pour les événements.
  • Un lien entre le consommateur et le filtre.

Pour plus d’informations, consultez Réception d’événements en permanence.

WMI fournit plusieurs consommateurs permanents. Les classes de consommateur et l’objet COM contenant le code sont préinstallés. Par exemple, vous pouvez créer et configurer une instance de la classe ActiveScriptEventConsumer pour exécuter un script lorsqu’un événement se produit. Pour plus d’informations, consultez Monitoring et réponse aux événements avec des consommateurs standard. Vous trouverez un exemple d’utilisation d’ActiveScriptEventConsumer dans la rubrique Exécution d’un script basé sur un événement.

La procédure suivante explique comment créer un consommateur d’événements permanent.

Pour créer un consommateur d’événements permanent

  1. Inscrivez le fournisseur d’événements auprès de l’espace de noms que vous utilisez.

    Certains fournisseurs d’événements peuvent utiliser uniquement un espace de noms spécifique. Par exemple, __InstanceCreationEvent est un événement intrinsèque pris en charge par le fournisseur Win32 et inscrit par défaut auprès de l’espace de noms \root\cimv2.

    Notes

    Vous pouvez utiliser la propriété EventNamespace de la classe __EventFilter utilisée dans l’inscription pour créer un abonnement entre espaces de noms. Pour plus d’informations, consultez Implémentation d’abonnements permanents à des événements entre espaces de noms.

     

  2. Inscrivez le fournisseur de consommateur d’événements auprès de l’espace de noms où se trouvent les classes d’événements.

    WMI utilise un fournisseur de consommateur d’événements pour rechercher un consommateur d’événements permanent. Le consommateur d’événements permanent est l’application que WMI démarre lorsqu’un événement est reçu. Pour inscrire un consommateur d’événements, les fournisseurs créent des instances de __EventConsumerProviderRegistration.

  3. Créez une instance de la classe qui représente le consommateur d’événements permanent que vous souhaitez utiliser.

    Les classes de consommateur d’événements sont dérivées de la classe __EventConsumer. Définissez les propriétés nécessaires à l’instance du consommateur d’événements.

  4. Inscrivez le consommateur auprès de COM à l’aide de l’utilitaire regsvr32.

  5. Créez une instance de la classe de filtre d’événements __EventFilter.

    Définissez les champs obligatoires pour l’instance de filtre d’événements. Les champs obligatoires pour __EventFilter sont Name, QueryLanguage et Query. La valeur de la propriété Name peut être n’importe quel nom unique représentant une instance de cette classe. La propriété QueryLanguage a toujours pour valeur « WQL ». La propriété Query est une chaîne qui contient une requête d’événement. Un événement est généré lorsqu’une requête du consommateur d’événements permanent échoue. La source de l’événement est WinMgmt, l’ID d’événement est 10 et le type d’événement est Error.

  6. Créez une instance de la classe __FilterToConsumerBinding pour associer un consommateur d’événements logique à un filtre d’événements.

    WMI utilise une association pour rechercher le consommateur d’événements associé à l’événement qui correspond aux critères spécifiés dans le filtre d’événements. WMI utilise le fournisseur de consommateur d’événements pour rechercher l’application de consommateur d’événements permanent à démarrer.