Monitoraggio degli eventi

Gli amministratori di sistema possono usare WMI per monitorare gli eventi in una rete. Ad esempio:

  • Un servizio si arresta in modo imprevisto.
  • Un server non è disponibile.
  • Un'unità disco riempie fino al 80% della capacità.
  • Gli eventi di sicurezza vengono segnalati a un registro eventi NT.

WMI supporta il rilevamento degli eventi e il recapito ai consumer di eventi perché alcuni provider WMI sono provider di eventi. Per altre informazioni, vedere Ricezione di un evento WMI.

I consumer di eventi sono applicazioni o script che richiedono la notifica degli eventi e quindi eseguono attività quando si verificano eventi specifici. È possibile creare script o applicazioni di monitoraggio eventi che monitorano temporaneamente quando si verificano eventi. WMI fornisce anche un set di provider di eventi permanenti preinstallati e le classi consumer permanenti che consentono di monitorare definitivamente gli eventi. Per altre informazioni, vedere Monitoraggio e risposta agli eventi con consumer standard.

Le sezioni seguenti sono illustrate in questo argomento:

Uso di consumer di eventi temporanei

I consumer di eventi temporanei sono script o applicazioni che restituiscono gli eventi che corrispondono a una query o a un filtro eventi. Le query di evento temporanee usano in genere IWbemServices::ExecNotificationQuery nelle applicazioni C++ o SWbemServices.ExecNotificationQuery negli script e In Visual Basic.

Una query evento richiede istanze di una classe di evento che specifica un determinato tipo di evento, ad esempio Win32_ProcessTrace o RegistryKeyChangeEvent.

Nell'esempio di codice VBScript seguente viene richiesta una notifica quando viene creata un'istanza di Win32_ProcessTrace . Un'istanza di questa classe viene generata quando un processo viene avviato o arrestato.

Per eseguire lo script, copiarlo in un file denominato event.vbs e usare la riga di comando seguente: cscript event.vbs. È possibile visualizzare l'output dallo script avviando Notepad.exe o qualsiasi altro processo. Lo script si arresta dopo l'avvio o l'arresto di cinque processi.

Questo script chiama SWbemServices.ExecNotificationQuery, ovvero la versione semisynchronous del metodo. Per un esempio di configurazione di una sottoscrizione temporanea asincrona, vedere lo script successivo chiamando SWbemServices.ExecNotificationQueryAsync. Per altre informazioni, vedere Chiamata di un metodo. Lo script chiama SWbemEventSource.NextEvent per ottenere ed elaborare ogni evento durante l'arrivo. Salvare lo script in un file con estensione vbs ed eseguire lo script in una riga di comando usando 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

I consumer di eventi temporanei devono essere avviati manualmente e non devono essere mantenuti tra i riavvii WMI o i riavvii del sistema operativo. Un consumer di eventi temporanei può elaborare eventi solo durante l'esecuzione.

La procedura seguente descrive come creare un consumer di eventi temporanei.

Per creare un consumer di eventi temporanei

  1. Decidere quale linguaggio di programmazione usare.

    Il linguaggio di programmazione determina l'API da usare.

  2. Avviare la codifica di un'applicazione consumer di eventi temporanei allo stesso modo in cui si avvia un'applicazione WMI.

    I primi passaggi della codifica dipendono dal linguaggio di programmazione. In genere, si accede a WMI e si configurano le impostazioni di sicurezza. Per altre informazioni, vedere Creazione di un'applicazione WMI o uno script.

  3. Definire la query dell'evento che si vuole usare.

    Per ottenere alcuni tipi di dati sulle prestazioni, potrebbe essere necessario usare classi fornite da provider ad alte prestazioni. Per altre informazioni, vedere Monitoraggio dei dati sulle prestazioni, determinazione del tipo di evento da ricevere e query con WQL.

  4. Decidere di effettuare una chiamata asincrona o una chiamata semisynchrono e scegliere il metodo API.

    Le chiamate asincrone consentono di evitare il sovraccarico del polling per i dati. Tuttavia, le chiamate semisynchrono forniscono prestazioni simili con maggiore sicurezza. Per altre informazioni, vedere Chiamata di un metodo.

  5. Eseguire la chiamata al metodo asincrona o semisynchrono e includere una query evento come parametro strQuery .

    Per le applicazioni C++ chiamare i metodi seguenti:

    Per gli script, chiamare i metodi seguenti:

  6. Scrivere il codice per elaborare l'oggetto evento restituito.

    Per le query di eventi asincrone, inserire il codice nei vari metodi o eventi del sink dell'oggetto. Per le query sugli eventi semisynchrono, ogni oggetto viene restituito come ottenuto da WMI, pertanto il codice deve trovarsi nel ciclo che gestisce ogni oggetto.

L'esempio di codice script seguente è una versione asincrona dello script Win32_ProcessTrace . Poiché le operazioni asincrone restituiscono immediatamente, una finestra di dialogo mantiene attivo lo script mentre è in attesa di eventi.

Anziché chiamare SWbemEventSource.NextEvent per ricevere ogni evento, lo script ha un gestore eventi per l'evento 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

Nota

Un callback asincrono, ad esempio un callback gestito dalla SINK_OnObjectReady subroutine, consente a un utente non autenticato di fornire dati al sink. Per una maggiore sicurezza, usare la comunicazione semisynchrono o la comunicazione sincrona. Per altre informazioni, vedere gli argomenti seguenti:

 

Uso di consumer di eventi permanenti

Un consumer di eventi permanente viene eseguito fino a quando la registrazione non viene annullata in modo esplicito e quindi viene avviata quando WMI o il sistema viene riavviato.

Un consumer di eventi permanente è una combinazione di classi, filtri e oggetti COM WMI in un sistema.

L'elenco seguente identifica le parti necessarie per creare un consumer di eventi permanente:

  • Oggetto COM contenente il codice che implementa il consumer permanente.
  • Nuova classe di consumer permanente.
  • Istanza della classe consumer permanente.
  • Filtro che contiene la query per gli eventi.
  • Collegamento tra il consumer e il filtro.

Per altre informazioni, vedere Ricezione di eventi in qualsiasi momento.

WMI fornisce diversi consumer permanenti. Le classi consumer e l'oggetto COM contenenti il codice sono preinstallati. Ad esempio, è possibile creare e configurare un'istanza della classe ActiveScriptEventConsumer per eseguire uno script quando si verifica un evento. Per altre informazioni, vedere Monitoraggio e risposta agli eventi con consumer standard. Per un esempio di uso di ActiveScriptEventConsumer, vedere Esecuzione di uno script basato su un evento.

La procedura seguente descrive come creare un consumer di eventi permanente.

Per creare un consumer di eventi permanente

  1. Registrare il provider di eventi con lo spazio dei nomi usato.

    Alcuni provider di eventi possono usare solo uno spazio dei nomi specifico. Ad esempio, __InstanceCreationEvent è un evento intrinseco supportato dal provider Win32 ed è registrato per impostazione predefinita con lo spazio dei nomi \root\cimv2.

    Nota

    È possibile usare la proprietà EventNamespace della __EventFilter utilizzata nella registrazione per creare una sottoscrizione tra spazi dei nomi. Per altre informazioni, vedere Implementazione di sottoscrizioni di eventi permanenti tra spazi dei nomi.

     

  2. Registrare il provider consumer di eventi con lo spazio dei nomi in cui si trovano le classi di eventi.

    WMI usa un provider consumer di eventi per trovare un consumer di eventi permanente. Il consumer di eventi permanenti è l'applicazione che WMI inizia quando viene ricevuto un evento. Per registrare un consumer di eventi, i provider creano istanze di __EventConsumerProviderRegistration.

  3. Creare un'istanza della classe che rappresenta il consumer di eventi permanente che si vuole usare.

    Le classi consumer di eventi sono derivate dalla classe __EventConsumer. Impostare le proprietà necessarie per l'istanza del consumer di eventi.

  4. Registrare il consumer con COM usando l'utilità regsvr32 .

  5. Creare un'istanza della classe di filtro eventi __EventFilter.

    Impostare i campi obbligatori per l'istanza del filtro eventi. I campi obbligatori per __EventFilter sono Name, QueryLanguage e Query. La proprietà Name può essere qualsiasi nome univoco per un'istanza di questa classe. La proprietà QueryLanguage è sempre impostata su "WQL". La proprietà Query è una stringa che contiene una query evento. Un evento viene generato quando la query di un consumer di eventi permanente ha esito negativo. L'origine dell'evento è WinMgmt, l'ID evento è 10 e il tipo di evento è Error.

  6. Creare un'istanza della classe __FilterToConsumerBinding per associare un consumer di eventi logici a un filtro eventi.

    WMI usa un'associazione per trovare il consumer di eventi associato all'evento che corrisponde ai criteri specificati nel filtro eventi. WMI usa il provider consumer di eventi per trovare l'applicazione consumer di eventi permanente da avviare.