Systeembeheerders kunnen WMI gebruiken om gebeurtenissen in een netwerk te bewaken. Bijvoorbeeld:
Een service stopt onverwacht.
Een server is niet meer beschikbaar.
Een schijfstation vult tot 80% capaciteit.
Beveiligings gebeurtenissen worden gerapporteerd aan een NT-gebeurtenislogboek.
WMI ondersteunt gebeurtenisdetectie en -levering aan gebeurtenisgebruikers omdat sommige WMI-providers gebeurtenisproviders zijn. Zie Een WMI-gebeurtenis ontvangenvoor meer informatie.
gebeurtenisgebruikers toepassingen of scripts zijn die meldingen van gebeurtenissen aanvragen en vervolgens taken uitvoeren wanneer specifieke gebeurtenissen optreden. U kunt scripts voor gebeurtenisbewaking of toepassingen maken die tijdelijk controleren wanneer er gebeurtenissen plaatsvinden. WMI levert ook een set vooraf geïnstalleerde providerklassen voor permanente gebeurtenissen en permanente consumentklassen, waarmee u gebeurtenissen permanent kunt bewaken. Zie Gebeurtenissen bewaken en reageren op gebeurtenissen met standaardconsumentenvoor meer informatie.
In dit onderwerp worden de volgende secties besproken:
Tijdelijke gebeurtenisgebruikers zijn scripts of toepassingen die de gebeurtenissen retourneren die overeenkomen met een gebeurtenisquery of -filter. Tijdelijke gebeurtenisquery's gebruiken meestal IWbemServices::ExecNotificationQuery in C++ toepassingen of SWbemServices.ExecNotificationQuery in scripts en Visual Basic.
Een gebeurtenisquery vraagt exemplaren van een gebeurtenisklasse op die een bepaald type gebeurtenis aangeeft, zoals Win32_ProcessTrace of RegistryKeyChangeEvent.
In het volgende VBScript-codevoorbeeld wordt een melding aangevraagd wanneer een exemplaar van Win32_ProcessTrace wordt gemaakt. Er wordt een exemplaar van deze klasse gegenereerd wanneer een proces wordt gestart of gestopt.
Als u het script wilt uitvoeren, kopieert u het naar een bestand met de naam event.vbs en gebruikt u de volgende opdrachtregel: cscript event.vbs. U kunt uitvoer van het script zien door Notepad.exe of een ander proces te starten. Het script stopt nadat vijf processen zijn gestart of gestopt.
Met dit script wordt SWbemServices.ExecNotificationQueryaangeroepen. Dit is de semisynchrone versie van de methode. Zie het volgende script voor een voorbeeld van het instellen van een asynchroon tijdelijk gebeurtenisabonnement door het aanroepen van SWbemServices.ExecNotificationQueryAsync. Zie Een methode aanroepenvoor meer informatie. Het script roept SWbemEventSource.NextEvent aan om elke gebeurtenis te verkrijgen en te verwerken wanneer deze binnenkomt. Sla het script op in een bestand met de extensie .vbs en voer het script uit op een opdrachtregel met 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
Tijdelijke evenementconsumenten moeten handmatig worden gestart en mogen niet behouden blijven na WMI-herstarts of het opnieuw opstarten van het besturingssysteem. Een tijdelijke gebeurtenisconsumer kan alleen gebeurtenissen verwerken terwijl deze wordt uitgevoerd.
In de volgende procedure wordt beschreven hoe u een tijdelijke gebeurtenisconsumer maakt.
Een tijdelijke gebeurtenisconsumer maken
Bepaal welke programmeertaal moet worden gebruikt.
De programmeertaal bepaalt welke API moet worden gebruikt.
Begin met het coderen van een tijdelijke gebeurtenisconsumertoepassing op dezelfde manier als u een WMI-toepassing start.
De eerste stappen van coderen zijn afhankelijk van de programmeertaal. Normaal gesproken meldt u zich aan bij WMI en stelt u de beveiligingsinstellingen in. Zie Een WMI-toepassing of -script makenvoor meer informatie.
Definieer de gebeurtenisquery die u wilt gebruiken.
Besluit om een asynchrone aanroep of een semisynchrone aanroep te maken en kies de API-methode.
Met asynchrone aanroepen kunt u de overhead van het voortdurend controleren van gegevens voorkomen. Semisynchrone aanroepen bieden echter vergelijkbare prestaties met een betere beveiliging. Zie Een methode aanroepenvoor meer informatie.
Voer de asynchrone of semisynchrone methode aanroep uit en neem een gebeurtenisquery op als de parameter strQuery.
Roep voor C++-toepassingen de volgende methoden aan:
Schrijf de code om het geretourneerde gebeurtenisobject te verwerken.
Voor asynchrone gebeurtenisquery's plaatst u de code in de verschillende methoden of gebeurtenissen van de objectsink. Voor semisynchrone gebeurtenisquery's wordt elk object geretourneerd zodra WMI het verkrijgt, dus de code moet zich bevinden in de loop die elk object verwerkt.
Het volgende voorbeeld van scriptcode is een asynchrone versie van het Win32_ProcessTrace script. Omdat asynchrone bewerkingen onmiddellijk worden geretourneerd, houdt een dialoogvenster het script actief terwijl er wordt gewacht op gebeurtenissen.
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
Notitie
Met een asynchrone callback, zoals een callback die wordt verwerkt door de SINK_OnObjectReady subroutine, kan een niet-geverifieerde gebruiker gegevens aan de sink verstrekken. Gebruik semisynchrone communicatie of synchrone communicatie voor betere beveiliging. Zie de volgende onderwerpen voor meer informatie:
Een permanente gebeurtenisconsument blijft actief totdat de registratie expliciet wordt geannuleerd en wordt vervolgens opnieuw gestart wanneer WMI of het systeem opnieuw wordt opgestart.
Een permanente gebeurtenisconsumer is een combinatie van WMI-klassen, filters en COM-objecten op een systeem.
De volgende lijst bevat de onderdelen die vereist zijn voor het maken van een permanente event-consument:
Een COM-object met de code waarmee de permanente consument wordt geïmplementeerd.
Een nieuwe permanente consumentenklasse.
Een exemplaar van de permanente consumentenklasse.
Een filter dat de query voor gebeurtenissen bevat.
Sommige gebeurtenisproviders kunnen alleen een specifieke naamruimte gebruiken.
__InstanceCreationEvent is bijvoorbeeld een intrinsieke gebeurtenis die wordt ondersteund door de Win32-provider en standaard is geregistreerd bij de \root\cimv2-naamruimte.
WMI gebruikt een gebeurtenisconsumerprovider om een gebeurtenisconsumer te vinden die permanent is. De consument voor permanente gebeurtenissen is de toepassing die WMI start wanneer een gebeurtenis wordt ontvangen. Om een eventconsumer te registreren, maken providers exemplaren van __EventConsumerProviderRegistration.
Maak een exemplaar van de klasse die de permanente gebeurtenisconsumer vertegenwoordigt die u wilt gebruiken.
Gebeurtenisconsumerklassen zijn afgeleid van de klasse __EventConsumer. Stel de eigenschappen in die de gebeurtenisverbruiker nodig heeft.
Registreer de consument bij COM met behulp van het hulpprogramma regsvr32.
Maak een exemplaar van de gebeurtenisfilterklasse __EventFilter.
Stel de vereiste velden in voor de instantie van het gebeurtenisfilter. De vereiste velden voor __EventFilter zijn Name, QueryLanguageen Query. De eigenschap Name kan elke unieke naam zijn voor een exemplaar van deze klasse. De eigenschap QueryLanguage is altijd ingesteld op 'WQL'. De eigenschap Query is een tekenreeks die een gebeurtenisquery bevat. Er wordt een gebeurtenis gegenereerd wanneer de query van een permanente gebeurtenisgebruiker mislukt. De bron van de gebeurtenis is WinMgmt, de gebeurtenis-id is 10 en het gebeurtenistype is Fout.
Maak een exemplaar van de __FilterToConsumerBinding-klasse om een logische gebeurtenisconsumer te koppelen aan een gebeurtenisfilter.
WMI gebruikt een koppeling om de gebeurtenisconsumer te vinden die is gekoppeld aan de gebeurtenis die overeenkomt met de criteria die zijn opgegeven in het gebeurtenisfilter. WMI gebruikt de gebeurtenis-consumerprovider om de permanente gebeurtenisconsumeertoepassing te vinden en te starten.
Ontdek hoe Logboeken een handige en toegankelijke locatie biedt waarmee u gebeurtenissen kunt observeren die optreden. Krijg snel en gemakkelijk toegang tot gebeurtenisgegevens. Meer informatie over het interpreteren van de gegevens in het gebeurtenislogboek.
WMI bevat een gebeurtenisinfrastructuur die meldingen produceert over wijzigingen in WMI-gegevens en -services. WMI-gebeurtenisklassen geven een melding wanneer er specifieke gebeurtenissen plaatsvinden.
Roadmap voor het gebruik van WMI voor het verkrijgen van gegevens voor clientscripts en toepassingen of voor het leveren van gegevens aan WMI vanuit een toepassing.
Windows Management Instrumentation (WMI) is de Microsoft-implementatie van Web-Based Enterprise Management (WBEM), een brancheinitiatief voor het ontwikkelen van een standaardtechnologie voor toegang tot beheerinformatie in een bedrijfsomgeving.
WMI heeft veel standaardproviders die in dit onderwerp worden vermeld. Zie WMI gebruiken voor meer informatie over het schrijven van uw eigen provider.