Synchrone en semisynchrone gebeurtenismeldingen ontvangen
Gebruik SWbemServices.ExecQuery- om alle bestaande gebeurtenissen aan te vragen.
In het volgende codevoorbeeld ziet u hoe u query's kunt uitvoeren op de gebeurtenissen in een logboek.
Select * from Win32_NTLogEvent
Zie voor meer informatie Bepalen van het type gebeurtenis dat moet worden ontvangen, Ontvangen van gebeurtenismeldingenen WQL (SQL for WMI).
De standaardaanroep naar SWbemServices.ExecNotificationQuery maakt gebruik van semisynchrone communicatie. De iflags parameter heeft de wbemFlagForwardOnly en wbemFlagReturnImmediately vlaggen standaard ingesteld. Zie Een methode aanroepenvoor meer informatie.
In de volgende procedure wordt beschreven hoe u een semisynchrone gebeurtenismelding ontvangt met behulp van VBScript.
Een melding over semisynchrone gebeurtenissen ontvangen in VBScript-
Maak een query voor het type gebeurtenis dat u wilt ontvangen. Zie Bepalen welk type gebeurtenis moet worden ontvangenvoor meer informatie.
Als u een exemplaartype van een gebeurtenis zoals __InstanceCreationEventaanvraagt, geeft u in de query een type doelexemplaren aan, bijvoorbeeld Win32_LogicalDisk.
Geef indien nodig een instantie op, bijvoorbeeld de naam van een naamruimte bij het aanvragen van toekomstige __NamespaceModificationEvent instanties voor een specifieke naamruimte.
Geef een polling-interval op voor Windows Management Instrumentation (WMI) in een query, zoals 'BINNEN 10', om elke 10 seconden een poll uit te voeren. Zie voor meer informatie WITHIN Clause.
Roep SWbemServices.ExecNotificationQuery aan met behulp van de query.
Loop door de verzameling die je ontvangt.
In het volgende voorbeeld ziet u hoe u het invoegen en verwijderen van schijven van een diskettestation op een lokale computer bewaakt. Het script vraagt ___InstanceModificationEvent instanties voor het diskettestation Win32_LogicalDisk exemplaar en controleert elke 10 seconden op nieuwe exemplaren. Dit script is een voorbeeld van een tijdelijke gebeurtenisconsumer en blijft actief totdat het is gestopt in Taakbeheer of het systeem opnieuw wordt opgestart. Zie voor meer informatie Het ontvangen van gebeurtenissen gedurende de duur van uw applicatie.
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
In de volgende procedure wordt beschreven hoe u semisynchrone gebeurtenismeldingen ontvangt met behulp van C++.
Een melding over semisynchrone gebeurtenissen ontvangen in C++
Stel de toepassing in met aanroepen naar de functies CoInitializeEx en CoInitializeSecurity.
Omdat WMI COM-gebaseerd is, is het aanroepen van CoInitializeEx en CoInitializeSecurity een vereiste stap voor een WMI-toepassing. Zie Een WMI-toepassing of -script makenvoor meer informatie.
Bepaal het soort gebeurtenissen dat u wilt ontvangen.
WMI ondersteunt intrinsieke en extrinsische gebeurtenissen. Een intrinsieke gebeurtenis is een gebeurtenis die vooraf is gedefinieerd door WMI. Een extrinsische gebeurtenis is een gebeurtenis die is gedefinieerd door een externe provider. Zie Bepalen welk type gebeurtenis moet worden ontvangenvoor meer informatie.
Registreer u om een specifieke klasse gebeurtenissen te ontvangen met een aanroep naar de methode IWbemServices::ExecNotificationQuery.
Maak elke query zeer specifiek. Het doel van registratie is om alleen de vereiste meldingen te ontvangen. Meldingen die niet nodig zijn voor afvalverwerking en levertijd.
U kunt een gebeurtenisconsumer ontwerpen om meerdere gebeurtenissen te ontvangen. Een consument kan bijvoorbeeld een melding vereisen van gebeurtenissen van exemplaarwijzigingen voor een specifieke klasse van apparaten en gebeurtenissen van beveiligingsschendingen. In dit geval verschillen de taken die een consument uitvoert bij het ontvangen van een wijziging van een instantie van elkaar voor de twee gebeurtenissen. De consument moet dus één aanroep uitvoeren naar IWbemServices::ExecNotificationQuery om bijvoorbeeld wijzigingsgebeurtenissen te registreren en een andere aanroep naar ExecNotificationQuery- om te registreren voor beveiligingsschendingen.
Bij het aanroepen van ExecNotificationQuery, stel de parameter lFlags in op WBEM_FLAG_RETURN_IMMEDIATELY en WBEM_FLAG_FORWARD_ONLY. De WBEM_FLAG_RETURN_IMMEDIATELY vlag vraagt semisynchrone verwerking aan en de WBEM_FLAG_FORWARD_ONLY vlag vraagt een alleen-vooruit enumerator aan. Zie Een methode aanroepenvoor meer informatie. De functie ExecNotificationQuery retourneert een aanwijzer naar een IEnumWbemClassObject interface.
Opvragen van geregistreerde gebeurtenismeldingen door herhaaldelijk de methode IEnumWbemClassObject::Next aan te roepen.
Wanneer u klaar bent, laat u de enumerator los die verwijst naar het IEnumWbemClassObject object.
U kunt de aanwijzer van de IWbemServices die is gekoppeld aan de registratie vrijgeven. Het vrijgeven van de IWbemServices pointer zorgt ervoor dat WMI stopt met het leveren van gebeurtenissen aan alle gekoppelde tijdelijke consumenten.