Een WMI-gebeurtenis ontvangen
WMI bevat een gebeurtenisinfrastructuur die meldingen produceert over wijzigingen in WMI-gegevens en -services. WMI gebeurtenisklassen bieden een melding wanneer specifieke gebeurtenissen plaatsvinden.
In dit onderwerp worden de volgende secties besproken:
- Evenementvragen
- een voorbeeld van
- Gebruikers van gebeurtenissen
- Het verstrekken van evenementen
- abonnementsquota
- Verwante onderwerpen
Gebeurteniszoekopdrachten
U kunt een semisynchrone of asynchrone query maken om wijzigingen in gebeurtenislogboeken, procescreatie, servicestatus, beschikbaarheid van de computer of vrije ruimte op de schijf en andere entiteiten of gebeurtenissen te controleren. Bij het uitvoeren van scripts wordt de methode SWbemServices.ExecNotificationQuery gebruikt om u te abonneren op gebeurtenissen. In C++wordt IWbemServices::ExecNotificationQuery gebruikt. Zie Een methode aanroepenvoor meer informatie.
Melding van een wijziging in het standaard-WMI-gegevensmodel wordt een intrinsieke gebeurtenisgenoemd. __InstanceCreationEvent of __NamespaceDeletionEvent zijn voorbeelden van intrinsieke gebeurtenissen. Melding van een wijziging die een provider aanbrengt om een provider gebeurtenis te definiëren, wordt een extrinsische gebeurtenisgenoemd. Bijvoorbeeld de System Registry Provider, Power Management Event Provideren Win32 Provider hun eigen gebeurtenissen definiëren. Zie Bepalen welk type gebeurtenis moet worden ontvangenvoor meer informatie.
Voorbeeld
Het volgende voorbeeld van scriptcode is een query voor de intrinsieke __InstanceCreationEvent van de gebeurtenisklasse Win32_NTLogEvent. U kunt dit programma op de achtergrond uitvoeren en wanneer er een gebeurtenis is, wordt er een bericht weergegeven. Als u het dialoogvenster Wachten op gebeurtenissen sluit, wacht het programma niet meer op gebeurtenissen. Houd er rekening mee dat de SeSecurityPrivilege- moet zijn ingeschakeld.
Sub SINK_OnObjectReady(objObject, objAsyncContext)
WScript.Echo (objObject.TargetInstance.Message)
End Sub
Set objWMIServices = GetObject( _
"WinMgmts:{impersonationLevel=impersonate, (security)}")
' Create the event sink object that receives the events
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
' Set up the event selection. SINK_OnObjectReady is called when
' a Win32_NTLogEvent event occurs
objWMIServices.ExecNotificationQueryAsync sink,"SELECT * FROM __InstanceCreationEvent " & "WHERE TargetInstance ISA 'Win32_NTLogEvent' "
WScript.Echo "Waiting for events"
# Define event Query
$query = "SELECT * FROM __InstanceCreationEvent
WHERE TargetInstance ISA 'Win32_NTLogEvent' "
<# Register for event - also specify an action that
displays the log event when the event fires.#>
Register-WmiEvent -Source Demo1 -Query $query -Action {
Write-Host "Log Event occured"
$global:myevent = $event
Write-Host "EVENT MESSAGE"
Write-Host $event.SourceEventArgs.NewEvent.TargetInstance.Message}
<# So wait #>
"Waiting for events"
In het volgende VBScript-codevoorbeeld ziet u de extrinsische gebeurtenis __RegistryValueChangeEvent die de registerprovider definieert. Het script maakt een tijdelijke consument met behulp van de aanroep naar SWbemServices.ExecNotificationQueryAsyncen ontvangt alleen gebeurtenissen wanneer het script wordt uitgevoerd. Het volgende script wordt voor onbepaalde tijd uitgevoerd totdat de computer opnieuw is opgestart, WMI is gestopt of het script is gestopt. Als u het script handmatig wilt stoppen, gebruikt u Taakbeheer om het proces te stoppen. Als u deze programmatisch wilt stoppen, gebruikt u de methode Terminate in de klasse Win32_Process. Zie Beveiliging instellen voor een Asynchrone aanroepvoor meer informatie.
strComputer = "."
Set objWMIServices=GetObject( _
"winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default")
set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIServices.ExecNotificationQueryAsync objSink, _
"Select * from RegistryValueChangeEvent Where Hive = 'HKEY_LOCAL_MACHINE' and KeyPath = 'SYSTEM\\ControlSet001\\Control' and ValueName = 'CurrentUser'"
WScript.Echo "Waiting for events..."
While (True)
WScript.Sleep (1000)
Wend
WScript.Echo "Listening for Registry Change Events..." & vbCrLf
While(True)
WScript.Sleep 1000
Wend
Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
WScript.Echo "Received Registry Value Change Event" & vbCrLf & wmiObject.GetObjectText_()
End Sub
Gebeurtenisconsumenten
U kunt gebeurtenissen bewaken of gebruiken met behulp van de volgende consumenten terwijl een script of toepassing wordt uitgevoerd:
Consumenten van tijdelijke evenementen
Een tijdelijke consument is een WMI-clienttoepassing die een WMI-gebeurtenis ontvangt. WMI bevat een unieke interface die wordt gebruikt om de gebeurtenissen voor WMI op te geven die naar een clienttoepassing moeten worden verzonden. Een tijdelijke gebeurtenisconsumer wordt als tijdelijk beschouwd omdat deze alleen werkt wanneer deze specifiek door een gebruiker wordt geladen. Zie Ontvangen van gebeurtenissen voor de duur van uw toepassingvoor meer informatie.
Consumenten van permanente gebeurtenissen
Een permanente consument is een COM-object dat altijd een WMI-gebeurtenis kan ontvangen. Een permanente gebeurtenisgebruiker maakt gebruik van een set permanente objecten en filters om een WMI-gebeurtenis vast te leggen. Net als een tijdelijke gebeurtenisconsumer stelt u een reeks WMI-objecten en filters in waarmee een WMI-gebeurtenis wordt vastgelegd. Wanneer een gebeurtenis optreedt die overeenkomt met een filter, laadt WMI de permanente gebeurtenisconsumer en meldt deze over de gebeurtenis. Omdat een permanente consument wordt geïmplementeerd in de WMI-opslagplaats en een uitvoerbaar bestand is dat is geregistreerd in WMI, werkt de consument voor permanente gebeurtenissen en ontvangt deze gebeurtenissen nadat deze is gemaakt en zelfs nadat het besturingssysteem opnieuw is opgestart zolang WMI wordt uitgevoerd. Zie Het continu ontvangen van gebeurtenissenvoor meer informatie.
Scripts of toepassingen die gebeurtenissen ontvangen, hebben speciale beveiligingsoverwegingen. Voor meer informatie, zie WMI-gebeurtenissen beveiligen.
Een toepassing of script kan een ingebouwde WMI-eventprovider gebruiken die standaardconsumentenklassenlevert. Elke standaardconsumerklasse reageert op een gebeurtenis met een andere actie door een e-mailbericht te verzenden of een script uit te voeren. U hoeft geen providercode te schrijven om een standaardconsumerklasse te gebruiken om een permanente gebeurtenisconsumer te maken. Zie Gebeurtenissen bewaken en reageren op gebeurtenissen met standaardconsumentenvoor meer informatie.
Evenementen aanbieden
Een gebeurtenisprovider is een COM-onderdeel dat een gebeurtenis naar WMI verzendt. U kunt een gebeurtenisprovider maken om een gebeurtenis te verzenden in een C++- of C#-toepassing. De meeste gebeurtenisproviders beheren een object voor WMI, bijvoorbeeld een toepassing of hardware-item. Zie Een gebeurtenisprovider schrijvenvoor meer informatie.
Een getimede of herhalende gebeurtenis is een gebeurtenis die plaatsvindt op een vooraf bepaalde tijd.
WMI biedt de volgende manieren om getimede of herhalende gebeurtenissen voor uw toepassingen te maken:
- De standaard microsoft-gebeurtenisinfrastructuur.
- Een gespecialiseerde timerklasse.
Voor meer informatie, zie Een getimede of herhalende gebeurtenis ontvangen. Wanneer u een gebeurtenisprovider schrijft, moet u rekening houden met de beveiligingsinformatie die is geïdentificeerd in Gebeurtenissen Veilig Verstrekken.
Het wordt aanbevolen om permanente gebeurtenisabonnementen te compileren in de \root\subscription namespace. Zie Permanente gebeurtenisabonnementen voor meerdere naamruimten implementerenvoor meer informatie.
Abonnementsquota
Polling voor gebeurtenissen kan de prestaties verminderen voor providers die ondersteuning bieden voor query's via enorme gegevenssets. Bovendien kan elke gebruiker met leestoegang tot een naamruimte met dynamische providers een DoS-aanval (Denial of Service) uitvoeren. WMI onderhoudt quota voor alle samengevoegde gebruikers en voor elke gebeurtenisconsument in het enige exemplaar van __ArbitratorConfiguration dat zich bevindt in de \root-namespace. Deze quota zijn globaal in plaats van voor elke naamruimte. U kunt de quota niet wijzigen.
WMI dwingt momenteel quota af met behulp van de eigenschappen van __ArbitratorConfiguration. Elk quotum heeft een versie per gebruiker en een totale versie die alle gebruikers omvat, niet per naamruimte. De volgende tabel bevat de quota die van toepassing zijn op de __ArbitratorConfiguration eigenschappen.
Totaal/peruser | Quotum |
---|---|
Tijdelijke Abonnementen Totaal TijdelijkeAbonnementenPerGebruiker |
10.000 1,000 |
Totaal Permanente Abonnementen Permanente Abonnementen per Gebruiker |
10.000 1,000 |
PollingInstructionsTotal InstructiesVoorPollingPerGebruiker |
10.000 1,000 |
PollingGeheugenTotaal PollingMemoryPerUser |
10.000.000 (0x989680) bytes 5.000.000 (0x4CB40) bytes |
Een beheerder of een gebruiker met FULL_WRITE machtiging in de naamruimte kan het singleton-exemplaar van __ArbitratorConfigurationwijzigen. WMI houdt het quotum per gebruiker bij.
Verwante onderwerpen
-
WMI- gebruiken