Condividi tramite


Ricezione di notifiche degli eventi sincrone e semisynchronous

Usare SWbemServices.ExecQuery per richiedere tutti gli eventi esistenti.

Nell'esempio di codice seguente viene illustrato come eseguire una query per gli eventi in un log.

Select * from Win32_NTLogEvent

Per altre informazioni, vedere Determinazione del tipo di evento da ricevere, ricezione di notifiche degli eventi e WQL (SQL per WMI).

La chiamata predefinita a SWbemServices.ExecNotificationQuery usa la comunicazione semisynchronous. Il parametro iflags ha i flag wbemFlagForwardOnly e wbemFlagReturnImmediately impostati per impostazione predefinita. Per altre informazioni, vedere Chiamata di un metodo.

La procedura seguente descrive come ricevere una notifica degli eventi semisynchronous tramite VBScript.

Per ricevere una notifica degli eventi semisynchronous in VBScript

  1. Creare una query per il tipo di evento che si desidera ricevere. Per altre informazioni, vedere Determinazione del tipo di evento da ricevere.

  2. Se si richiede un tipo di istanza di evento, ad esempio __InstanceCreationEvent, indicare nella query un tipo di istanza di destinazione, ad esempio Win32_LogicalDisk.

  3. Se necessario, specificare un'istanza, ad esempio, il nome di uno spazio dei nomi quando si richiedono istanze future __NamespaceModificationEvent per uno spazio dei nomi specifico.

  4. Specificare un intervallo di polling per Strumentazione gestione Windows (WMI) in una query, ad esempio "WITHIN 10" per eseguire il polling ogni 10 secondi. Per altre informazioni, vedere Clausola WITHIN.

  5. Chiamare SWbemServices.ExecNotificationQuery usando la query .

  6. Scorrere la raccolta ricevuta.

Nell'esempio seguente viene illustrato come monitorare l'inserimento e la rimozione di dischi da un'unità disco floppy in un computer locale. Lo script richiede le istanze ___InstanceModificationEvent per l'unità floppy Win32_LogicalDisk'istanza e esegue il polling ogni 10 secondi per le nuove istanze. Questo script è un esempio di consumer di eventi temporanei e continua l'esecuzione fino a quando non viene arrestato in Gestione attività o il sistema non viene riavviato. Per altre informazioni, vedere Ricezione di eventi per la durata dell'applicazione.

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 procedura seguente descrive come ricevere una notifica degli eventi semisynchrono usando C++.

Per ricevere una notifica degli eventi semisynchronous in C++

  1. Configurare l'applicazione con chiamate alle funzioni CoInitializeEx e CoInitializeSecurity .

    Poiché WMI è basato su COM, la chiamata a CoInitializeEx e CoInitializeSecurity è un passaggio obbligatorio per un'applicazione WMI. Per altre informazioni, vedere Creazione di un'applicazione WMI o di uno script.

  2. Determinare il tipo di eventi che si desidera ricevere.

    WMI supporta eventi intrinseci ed estrini. Un evento intrinseco è un evento predefinito da WMI. Un evento estrinsico è un evento definito da un provider di terze parti. Per altre informazioni, vedere Determinazione del tipo di evento da ricevere.

  3. Registrarsi per ricevere una classe specifica di eventi con una chiamata al metodo IWbemServices::ExecNotificationQuery .

    Rendere ogni query molto specifica. L'obiettivo della registrazione consiste nel registrare per ricevere solo le notifiche necessarie. Notifiche che non sono necessarie per l'elaborazione e il tempo di consegna dei rifiuti.

    È possibile progettare un consumer di eventi per ricevere più eventi. Ad esempio, un consumer potrebbe richiedere la notifica di eventi di modifica dell'istanza per una classe specifica di eventi di violazione del dispositivo e della sicurezza. In questo caso, le attività eseguite da un consumer durante la ricezione di un evento di modifica dell'istanza sono diverse per i due eventi. Pertanto, il consumer deve effettuare una chiamata a IWbemServices::ExecNotificationQuery per registrare gli eventi di modifica dell'istanza e un'altra chiamata a ExecNotificationQuery per registrare gli eventi di violazione della sicurezza.

    Nella chiamata a ExecNotificationQuery impostare il parametro lFlags su WBEM_FLAG_RETURN_IMMEDIATELY e WBEM_FLAG_FORWARD_ONLY. Il flag WBEM_FLAG_RETURN_IMMEDIATELY richiede l'elaborazione semiincrona e il flag WBEM_FLAG_FORWARD_ONLY richiede un enumeratore forward-only. Per altre informazioni, vedere Chiamata di un metodo. La funzione ExecNotificationQuery restituisce un puntatore a un'interfaccia IEnumWbemClassObject .

  4. Eseguire il polling delle notifiche degli eventi registrati effettuando chiamate ripetute al metodo IEnumWbemClassObject::Next .

  5. Al termine, rilasciare l'enumeratore che punta all'oggetto IEnumWbemClassObject .

    È possibile rilasciare il puntatore IWbemServices associato alla registrazione. Il rilascio del puntatore IWbemServices impedisce a WMI di recapitare eventi a tutti i consumer temporanei associati.