Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Gli amministratori di sistema possono usare WMI per monitorare gli eventi in una rete. Per esempio:
- Un servizio si arresta in modo imprevisto.
- Un server non è più disponibile.
- Un'unità disco si riempie di 80% capacità.
- Gli eventi di sicurezza vengono segnalati a un registro eventi NT.
WMI supporta il rilevamento e il recapito di eventi ai consumatori di eventi perché alcuni provider WMI sono provider di eventi. Per altre informazioni, vedere Ricezione di un evento WMI.
consumatori di eventi sono applicazioni o script che richiedono la notifica degli eventi e successivamente 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 classi di consumer permanenti che consentono di monitorare in modo permanente gli eventi. Per ulteriori informazioni, vedere Monitoraggio e risposta agli eventi con consumatori standard.
Le sezioni seguenti sono descritte in questo argomento:
Uso di consumatori di eventi temporanei
I consumatori di eventi temporanei sono script o applicazioni che restituiscono gli eventi che corrispondono a una query o un filtro di eventi. Le query di eventi temporanei 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 dello 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 semisincrona del metodo . Vedere lo script successivo per un esempio di configurazione di una sottoscrizione di eventi temporanei asincrona chiamando SWbemServices.ExecNotificationQueryAsync. Per ulteriori informazioni, vedere Chiamare un metodo. Lo script chiama SWbemEventSource.NextEvent per ottenere ed elaborare ogni evento man mano che arriva. Salvare lo script in un file con estensione vbs ed eseguire lo script in una riga di comando usando CScript: file cscript.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 consumatori di eventi temporanei devono essere avviati manualmente e non devono persistere tra i riavvii di WMI o del sistema operativo. Un consumatore di eventi temporaneo può elaborare gli eventi solo durante l'esecuzione.
La procedura seguente descrive come creare un consumatore di eventi temporaneo.
Per creare un consumer di eventi temporaneo
Decidere quale linguaggio di programmazione usare.
Il linguaggio di programmazione determina l'API da usare.
Inizia a programmare un'applicazione consumer di eventi temporanea allo stesso modo di come 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 script.
Definire la query dell'evento che si desidera utilizzare.
Per ottenere alcuni tipi di dati sulle prestazioni, potrebbe essere necessario usare classi fornite da provider ad alte prestazioni. Per ulteriori informazioni, vedere Monitoraggio dei dati sulle prestazioni, Determinare il tipo di evento da riceveree Interrogare con WQL.
Decidere di effettuare una chiamata asincrona o una chiamata semiincrona e scegliere il metodo API.
Le chiamate asincrone consentono di evitare la necessità di effettuare il polling dei dati. Tuttavia, le chiamate semiincrone offrono prestazioni simili con maggiore sicurezza. Per ulteriori informazioni, vedere Metodo di chiamata.
Effettuare la chiamata al metodo asincrono o semisincrono e includere una query di evento come parametro strQuery.
Per le applicazioni C++, chiamare i metodi seguenti:
Per gli script, chiamare i metodi seguenti:
- SWbemServices.ExecNotificationQuery
- SWbemServices.ExecNotificationQueryAsync
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 di eventi semiincrone, ogni oggetto viene restituito come ottenuto da WMI, pertanto il codice deve trovarsi nel ciclo che gestisce ogni oggetto.
L'esempio di codice di script seguente è una versione asincrona dello script Win32_ProcessTrace. Poiché le operazioni asincrone hanno un ritorno immediato, una finestra di dialogo mantiene attivo lo script mentre è in attesa degli eventi.
Anziché chiamare SWbemEventSource.NextEvent per ricevere ogni evento, lo script dispone di 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 subroutine SINK_OnObjectReady
, consente a un utente non autenticato di fornire dati al sink. Per una maggiore sicurezza, usare la comunicazione semisincrona o la comunicazione sincrona. Per altre informazioni, vedere gli argomenti seguenti:
Uso di consumatori di eventi permanenti
Un consumatore di eventi permanente continua a funzionare fino a quando la registrazione non viene annullata esplicitamente, e poi si avvia di nuovo quando WMI o il sistema vengono riavviati.
Un consumer di eventi permanente è una combinazione di classi, filtri e oggetti COM WMI in un sistema.
L'elenco seguente identifica i componenti necessari per creare un consumatore di eventi permanente.
- Oggetto COM contenente il codice che implementa il consumer permanente.
- Una nuova classe di consumatori permanente.
- Istanza della classe consumatore permanente.
- Il filtro che contiene la query per gli eventi.
- Collegamento tra il consumatore e il filtro.
Per altre informazioni, vedere ricezione di eventi in qualsiasi momento.
WMI fornisce diversi consumatori 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 ulteriori informazioni, vedere Monitoraggio e risposta agli eventi con consumatori standard. Per un esempio di utilizzo di ActiveScriptEventConsumer, vedere Esecuzione di uno script basato su un evento.
La procedura seguente descrive come creare un consumatore di eventi permanente.
Per creare un consumer di eventi permanente
Registrare il provider di eventi con lo spazio dei nomi in uso.
Alcuni provider di eventi possono usare solo uno spazio dei nomi specifico. Ad esempio, __InstanceCreationEvent è un evento intrinseco supportato dall'provider Win32 e registrato per impostazione predefinita con lo spazio dei nomi oot\cimv2 \r.
Nota
È possibile utilizzare la proprietà EventNamespace della __EventFilter utilizzata nella registrazione per creare una sottoscrizione tra spazi dei nomi. Per ulteriori informazioni, consultare Implementare le sottoscrizioni permanenti di eventi tra spazi dei nomi.
Registrare il provider del consumer di eventi con lo spazio dei nomi in cui si trovano le classi di evento.
WMI utilizza un fornitore di utilizzatori di eventi per trovare un utilizzatore di eventi permanente. Il consumatore di eventi permanenti è l'applicazione avviata da parte di WMI quando viene ricevuto un evento. Per registrare un consumer di eventi, i provider creano istanze di __EventConsumerProviderRegistration.
Creare un'istanza della classe che rappresenta il gestore di eventi permanente che desideri utilizzare.
Le classi consumatore di eventi sono derivate dalla classe __EventConsumer. Impostare le proprietà richieste dall'istanza del consumatore di eventi.
Registrare il consumatore con COM utilizzando l'utilità regsvr32.
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 Nome, QueryLanguagee 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 contenente una query di eventi. Un evento viene generato quando la query di un consumatore di eventi permanente ha esito negativo. L'origine dell'evento è WinMgmt, l'ID evento è 10 e il tipo di evento è Error.
Creare un'istanza della classe __FilterToConsumerBinding per associare un consumatore logico di eventi a un filtro per eventi.
WMI usa un'associazione per trovare il consumatore di eventi associato all'evento che corrisponde ai criteri specificati nel filtro dell'evento. WMI usa il provider di consumer di eventi per trovare l'applicazione consumer di eventi permanente da avviare.