Ta emot synkrona och semisynkrona händelsemeddelanden
Använd SWbemServices.ExecQuery för att begära alla befintliga händelser.
I följande kodexempel visas hur du frågar efter händelserna i en logg.
Select * from Win32_NTLogEvent
Mer information finns i fastställa vilken typ av händelse som ska ta emot, ta emot händelsemeddelandenoch WQL (SQL för WMI).
Standardanropet till SWbemServices.ExecNotificationQuery använder semisynkron kommunikation. Parametern iflags har wbemFlagForwardOnly och wbemFlagReturnImmediately flaggor som angetts som standard. För mer information, se Att anropa en metod.
Följande procedur beskriver hur du tar emot semisynkrona händelsemeddelanden med hjälp av VBScript.
Ta emot semisynkron händelseavisering i VBScript-
Skapa en fråga för den typ av händelse som du vill ta emot. Mer information finns i Fastställa vilken typ av händelse som ska ta emot.
Om du begär en instanstyp av händelse, till exempel __InstanceCreationEvent, anger du i frågan en typ av målinstans, till exempel Win32_LogicalDisk.
Om det behövs anger du en instans, till exempel namnet på ett namnområde när du begär framtida __NamespaceModificationEvent instanser för ett specifikt namnområde.
Ange ett pollningsintervall för Windows Management Instrumentation (WMI) i en fråga, till exempel "WITHIN 10"—för att avsöka var 10:e sekund. Mer information finns i WITHIN Clause.
Anropa SWbemServices.ExecNotificationQuery med hjälp av frågan.
Loopa igenom samlingen som du får.
I följande exempel visas hur du övervakar infogning och borttagning av diskar från en diskettenhet på en lokal dator. Skriptet begär ___InstanceModificationEvent instanser för diskettenheten Win32_LogicalDisk instans och avsöker var 10:e sekund för nya instanser. Det här skriptet är ett exempel på en tillfällig händelsekonsument och fortsätter att köras tills det stoppas i Aktivitetshanteraren eller systemet startas om. Mer information finns i Ta emot händelser under programmets varaktighet.
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
Följande procedur beskriver hur du tar emot semisynkrona händelsemeddelanden med hjälp av C++.
Ta emot semisynkron händelseavisering i C++
Konfigurera programmet med anrop till funktionerna CoInitializeEx och CoInitializeSecurity.
Eftersom WMI är COM-baserat är det ett obligatoriskt steg för ett WMI-program att anropa CoInitializeEx och CoInitializeSecurity. Mer information finns i Skapa ett WMI-program eller skript.
Fastställa vilken typ av händelser du vill ta emot.
WMI stöder inbyggda och extrinsiska händelser. En inbyggd händelse är en händelse som är fördefinierad av WMI. En extern händelse är en händelse som definieras av en tredjepartsleverantör. Mer information finns i Fastställa vilken typ av händelse som ska ta emot.
Registrera dig för att ta emot en specifik händelseklass med ett anrop till metoden IWbemServices::ExecNotificationQuery.
Gör varje fråga mycket specifik. Målet med registreringen är att registrera sig för att endast ta emot de meddelanden som krävs. Meddelanden som inte behövs slösar bort bearbetnings- och leveranstid.
Du kan utforma en händelsekonsument för att ta emot flera händelser. En konsument kan till exempel kräva meddelande om instansändringshändelser för en specifik klass av händelser för enhets- och säkerhetsöverträdelser. I det här fallet skiljer sig de uppgifter som en konsument utför när de tar emot en instansändringshändelse för de två händelserna. Konsumenten bör därför göra ett anrop till IWbemServices::ExecNotificationQuery, för att registrera sig för instansändringshändelser, och ett annat anrop till ExecNotificationQuery, för att registrera sig för händelser med säkerhetsöverträdelser.
I anropet till ExecNotificationQueryanger du parametern lFlags till WBEM_FLAG_RETURN_IMMEDIATELY och WBEM_FLAG_FORWARD_ONLY. WBEM_FLAG_RETURN_IMMEDIATELY-flaggan begär semisynkron bearbetning och WBEM_FLAG_FORWARD_ONLY-flaggan begär en uppräknare endast framåt. För mer information, se Anropa en metod. Funktionen ExecNotificationQuery returnerar en pekare till ett IEnumWbemClassObject--gränssnitt.
Sök efter registrerade händelsemeddelanden genom att göra upprepade anrop till metoden IEnumWbemClassObject::Next.
När du är klar släpper du uppräknaren som pekar på objektet IEnumWbemClassObject.
Du kan släppa IWbemServices pekare som är associerad med registreringen. Om du släpper IWbemServices pekaren slutar WMI att leverera händelser till alla associerade tillfälliga konsumenter.