Réception de notifications d’événements synchrones et semi-synchrones

Utilisez SWbemServices.ExecQuery pour demander tous les événements existants.

L’exemple de code suivant montre comment interroger les événements dans un journal.

Select * from Win32_NTLogEvent

Pour plus d’informations, consultez Détermination du type d’événement à recevoir, Réception de notifications d’événements et WQL (SQL pour WMI).

L’appel par défaut à SWbemServices.ExecNotificationQuery utilise la communication semi-synchrone. Le paramètre iflags a les indicateurs wbemFlagForwardOnly et wbemFlagReturnImmediately définis par défaut. Pour plus d’informations, consultez Appel d’une méthode.

La procédure suivante décrit comment recevoir une notification d’événement semi-synchronisée à l’aide de VBScript.

Pour recevoir des notifications d’événements asynchrones dans VBScript

  1. Créez une requête pour le type d’événement que vous souhaitez recevoir. Pour plus d’informations, consultez Détermination du type d’événement à recevoir.

  2. Si vous demandez un instance type d’événement tel que __InstanceCreationEvent, indiquez dans la requête un type de instance cible, par exemple, Win32_LogicalDisk.

  3. Si nécessaire, spécifiez un instance, par exemple, le nom d’un espace de noms lors de la demande d’instances de __NamespaceModificationEvent futures pour un espace de noms spécifique.

  4. Spécifiez un intervalle d’interrogation pour Windows Management Instrumentation (WMI) dans une requête, par exemple « WITHIN 10 », à interroger toutes les 10 secondes. Pour plus d’informations, consultez WITHIN Clause.

  5. Appelez SWbemServices.ExecNotificationQuery à l’aide de la requête.

  6. Parcourez en boucle la collection que vous recevez.

L’exemple suivant montre comment surveiller l’insertion et la suppression de disques à partir d’un lecteur de disquette sur un ordinateur local. Le script demande ___InstanceModificationEvent instances pour le lecteur de disquette Win32_LogicalDisk instance et interroge toutes les 10 secondes les nouvelles instances. Ce script est un exemple de consommateur d’événements temporaires et continue de s’exécuter jusqu’à ce qu’il soit arrêté dans le Gestionnaire des tâches ou que le système soit redémarré. Pour plus d’informations, consultez Réception d’événements pour la durée de votre application.

Const FLOPPY_DISK = 2
Set colMonitoredDisks = GetObject("Winmgmts:").ExecNotificationQuery _
    ("Select * from __InstanceModificationEvent within 10 WHERE " _
        & "TargetInstance ISA 'Win32_LogicalDisk'")
i = 0
Do While i = 0
    Set strDiskChange = colMonitoredDisks.NextEvent
    If strDiskChange.TargetInstance.DriveType = FLOPPY_DISK Then
        If strDiskChange.TargetInstance.Size > 0 Then
            Wscript.Echo "A disk has been inserted" & _
                " into the floppy drive."
    Else
            Wscript.Echo "A disk has been removed" & _
                " from the floppy drive."
        End If
    End If
Loop

La procédure suivante décrit comment recevoir une notification d’événement semi-synchrone à l’aide de C++.

Pour recevoir une notification d’événement semi-synchrone en C++

  1. Configurez l’application avec des appels aux fonctions CoInitializeEx et CoInitializeSecurity .

    Étant donné que WMI est basé sur COM, l’appel de CoInitializeEx et CoInitializeSecurity est une étape obligatoire pour une application WMI. Pour plus d’informations, consultez Création d’une application ou d’un script WMI.

  2. Déterminez le type d’événements que vous souhaitez recevoir.

    WMI prend en charge les événements intrinsèques et extrinsèques. Un événement intrinsèque est un événement prédéfini par WMI. Un événement extrinsèque est un événement défini par un fournisseur tiers. Pour plus d’informations, consultez Détermination du type d’événement à recevoir.

  3. Inscrivez-vous pour recevoir une classe d’événements spécifique avec un appel à la méthode IWbemServices::ExecNotificationQuery.

    Rendre chaque requête très spécifique. L’objectif de l’inscription est de s’inscrire pour recevoir uniquement les notifications requises. Les notifications qui ne sont pas requises gaspillent le traitement et le délai de livraison.

    Vous pouvez concevoir un consommateur d’événements pour recevoir plusieurs événements. Par exemple, un consommateur peut avoir besoin d’une notification de instance d’événements de modification pour une classe spécifique d’événements de violation de sécurité et d’appareil. Dans ce cas, les tâches qu’un consommateur effectue lors de la réception d’un événement de modification instance sont différentes pour les deux événements. Par conséquent, le consommateur doit effectuer un appel à IWbemServices::ExecNotificationQuery pour s’inscrire à instance événements de modification, et un autre appel à ExecNotificationQuery pour s’inscrire aux événements de violation de sécurité.

    Dans l’appel à ExecNotificationQuery, définissez le paramètre lFlagssur WBEM_FLAG_RETURN_IMMEDIATELY et WBEM_FLAG_FORWARD_ONLY. L’indicateur WBEM_FLAG_RETURN_IMMEDIATELY demande un traitement semi-synchronisé, et l’indicateur WBEM_FLAG_FORWARD_ONLY demande un énumérateur avant uniquement. Pour plus d’informations, consultez Appel d’une méthode. La fonction ExecNotificationQuery retourne un pointeur vers une interface IEnumWbemClassObject.

  4. Interrogez les notifications d’événements inscrits en effectuant des appels répétés à la méthode IEnumWbemClassObject::Next.

  5. Lorsque vous avez terminé, relâchez l’énumérateur qui pointe vers l’objet IEnumWbemClassObject .

    Vous pouvez libérer le pointeur IWbemServices associé à l’inscription. La libération du pointeur IWbemServices entraîne l’arrêt de la remise des événements par WMI à tous les consommateurs temporaires associés.