Bewakingsevenementen

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 gebruiken

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

  1. Bepaal welke programmeertaal moet worden gebruikt.

    De programmeertaal bepaalt welke API moet worden gebruikt.

  2. 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.

  3. Definieer de gebeurtenisquery die u wilt gebruiken.

    Als u bepaalde typen prestatiegegevens wilt verkrijgen, moet u mogelijk klassen gebruiken die worden geleverd door providers met hoge prestaties. Zie Prestatiegegevens bewaken, Bepalen van het type gebeurtenis datmoet worden ontvangen en query's uitvoeren met WQL-voor meer informatie.

  4. 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.

  5. 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:

    Roep voor scripts de volgende methoden aan:

  6. 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.

In plaats van SWbemEventSource.NextEvent aan te roepen om elke gebeurtenis te ontvangen, heeft het script een gebeurtenishandler voor de gebeurtenis SWbemSink OnObjectReady gebeurtenis.

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:

 

Het gebruik van permanente gebeurtenisconsumenten

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.
  • Een koppeling tussen de consument en het filter.

Voor meer informatie, zie Het altijd ontvangen van evenementen.

WMI levert verschillende permanente consumenten. De consumentenklassen en het COM-object met de code zijn vooraf geïnstalleerd. U kunt bijvoorbeeld een exemplaar van de ActiveScriptEventConsumer klasse maken en configureren om een script uit te voeren wanneer een gebeurtenis plaatsvindt. Zie Gebeurtenissen bewaken en reageren op gebeurtenissen met standaardconsumentenvoor meer informatie. Zie Uitvoeren van een script op basis van een gebeurtenisvoor een voorbeeld van het gebruik van ActiveScriptEventConsumer.

De volgende procedure beschrijft hoe u een permanente gebeurtenisconsumer kunt maken.

Een permanente evenementafnemer maken

  1. registreer de gebeurtenisprovider met de naamruimte die u gebruikt.

    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.

    Notitie

    U kunt de eigenschap EventNamespace van de __EventFilter die in de registratie wordt gebruikt, gebruiken om een abonnement voor meerdere naamruimten te maken. Zie Permanente gebeurtenisabonnementen voor meerdere naamruimten implementerenvoor meer informatie.

     

  2. Registreer de provider van de gebeurtenisconsumer met de naamruimte waar gebeurtenisklassen zich bevinden.

    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.

  3. 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.

  4. Registreer de consument bij COM met behulp van het hulpprogramma regsvr32.

  5. 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.

  6. 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.