Sdílet prostřednictvím


Monitorování událostí

Správci systému můžou pomocí rozhraní WMI monitorovat události v síti. Například:

  • Služba se neočekávaně zastaví.
  • Server bude nedostupný.
  • Disková jednotka se zaplní na 80 % kapacity%.
  • Události zabezpečení se hlásí do protokolu událostí NT.

Rozhraní WMI podporuje zjišťování a doručování událostí příjemcům událostí, protože někteří poskytovatelé rozhraní WMI jsou zprostředkovateli událostí. Další informace naleznete v tématu Příjem události WMI.

příjemci událostí jsou aplikace nebo skripty, které požadují oznámení událostí, a pak provádějí úlohy, když dojde k určitým událostem. Můžete vytvořit skripty monitorování událostí nebo aplikace, které dočasně monitorují, kdy dojde k událostem. WMI také poskytuje sadu předinstalovaných trvalých zprostředkovatelů událostí a trvalých spotřebitelských tříd, které umožňují trvalé monitorování událostí. Další informace naleznete v tématu Monitorování a reakce na události se standardními příjemci.

V tomto tématu jsou popsány následující části:

Použití dočasných příjemců událostí

Dočasní příjemci událostí jsou skripty nebo aplikace, které vrací události, které odpovídají dotazu nebo filtru události. Dočasné dotazy událostí obvykle používají IWbemServices::ExecNotificationQuery v aplikacích C++ nebo SWbemServices.ExecNotificationQuery ve skriptech a Visual Basicu.

Dotaz události požaduje instance třídy událostí, která určuje určitý typ události, například Win32_ProcessTrace nebo RegistryKeyChangeEvent.

Následující příklad kódu VBScript požádá o oznámení při vytvoření instance Win32_ProcessTrace. Instance této třídy je generována při spuštění nebo zastavení procesu.

Pokud chcete skript spustit, zkopírujte ho do souboru s názvem event.vbs a použijte následující příkazový řádek: cscript event.vbs. Výstup skriptu můžete zobrazit spuštěním Notepad.exe nebo jiným procesem. Skript se zastaví po spuštění nebo zastavení pěti procesů.

Tento skript volá SWbemServices.ExecNotificationQuery, což je polosynchronní verze metody. Příklad nastavení asynchronního dočasného odběru událostí voláním SWbemServices.ExecNotificationQueryAsyncnajdete v dalším skriptu. Další informace naleznete v tématu Volání metody. Skript volá SWbemEventSource.NextEvent, aby získal a zpracoval každou událost, jakmile dorazí. Uložte skript do souboru s příponou .vbs a spusťte skript na příkazovém řádku pomocí CScriptu: 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

Dočasní příjemci událostí musí být spuštěni ručně a nesmí se uchovávat napříč restartováními rozhraní WMI nebo restartováním operačního systému. Dočasný příjemce událostí může zpracovávat události pouze v době, kdy je spuštěný.

Následující postup popisuje, jak vytvořit dočasného příjemce událostí.

Vytvořit dočasného příjemce událostí

  1. Rozhodněte se, který programovací jazyk se má použít.

    Programovací jazyk určuje rozhraní API, které se má použít.

  2. Začněte kódovat dočasnou aplikaci příjemce událostí stejným způsobem, jakým spustíte aplikaci WMI.

    První kroky kódování závisí na programovacím jazyce. Obvykle se přihlásíte k rozhraní WMI a nastavíte nastavení zabezpečení. Další informace naleznete v tématu Vytvoření aplikace rozhraní WMI nebo skript.

  3. Definujte dotaz na událost, který chcete použít.

    Pokud chcete získat některé typy dat o výkonu, možná budete muset použít třídy poskytované poskytovateli s vysokým výkonem. Další informace najdete v tématu Monitorování dat výkonu, Určení typu události pro příjema dotazování pomocí jazyka WQL.

  4. Rozhodněte se provést asynchronní volání nebo polosynchronní volání a zvolte metodu rozhraní API.

    Asynchronní volání umožňují vyhnout se nákladům spojeným s dotazováním na data. Polosynchronní volání však poskytují podobný výkon s vyšším zabezpečením. Další informace naleznete v tématu Volání metody.

  5. Proveďte asynchronní nebo polosynchronní volání metody a zahrňte jako parametr strQuery dotaz události.

    Pro aplikace C++ volejte následující metody:

    Pro skripty volejte následující metody:

  6. Napište kód pro zpracování vráceného objektu události.

    V případě asynchronních dotazů na události vložte kód do různých metod nebo událostí přijímacího objektu. U částečně asynchronních dotazů na události se každý objekt vrátí, protože ho WMI získá, takže kód by měl být ve smyčce, která zpracovává každý objekt.

Následující příklad kódu skriptu je asynchronní verze skriptu Win32_ProcessTrace. Vzhledem k tomu, že asynchronní operace se okamžitě vrátí, dialogové okno udržuje skript aktivní, zatímco čeká na události.

Namísto volání SWbemEventSource.NextEvent pro přijímání každé události má skript obslužnou rutinu pro událost SWbemSink OnObjectReady.

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

Poznámka

Asynchronní zpětné volání, jako je zpětné volání zpracovávané podprogramem SINK_OnObjectReady, umožňuje neověřenému uživateli poskytovat data do jímky. Pro lepší zabezpečení použijte polosynchronní komunikaci nebo synchronní komunikaci. Další informace najdete v následujících tématech:

 

Použití trvalých příjemců událostí

Trvalý příjemce událostí běží, dokud není jeho registrace explicitně zrušena, a poté se znovu spustí, pokud je restartováno rozhraní WMI nebo systém.

Příjemce trvalých událostí je kombinací tříd WMI, filtrů a objektů COM v systému.

Následující seznam identifikuje části potřebné k vytvoření trvalého příjemce událostí:

  • Objekt COM obsahující kód, který implementuje trvalého příjemce.
  • Nová trvalá spotřebitelská třída.
  • Instance trvalé spotřebitelské třídy.
  • Filtr, který obsahuje dotaz na události.
  • Propojení mezi příjemcem a filtrem

Další informace naleznete v tématu Příjem událostí za všech okolností.

WMI dodává několik stálých odběratelů. Třídy příjemce a objekt COM obsahující kód jsou předinstalovány. Můžete například vytvořit a nakonfigurovat instanci ActiveScriptEventConsumer třídy pro spuštění skriptu, když dojde k události. Další informace naleznete v tématu Monitorování a reakce na události se standardními příjemci. Příklad použití ActiveScriptEventConsumernaleznete v tématu Spuštění skriptu na základě události.

Následující postup popisuje, jak vytvořit trvalého posluchače událostí.

Vytvořit trvalého příjemce událostí

  1. Zaregistrujte poskytovatele událostí v oboru názvů, který používáte.

    Někteří poskytovatelé událostí můžou používat jenom konkrétní obor názvů. Například __InstanceCreationEvent je vnitřní událost podporovaná poskytovatelem Win32 a je ve výchozím nastavení zaregistrovaná v oboru názvů \root\cimv2.

    Poznámka

    K vytvoření předplatného napříč obory názvů můžete použít vlastnost EventNamespace objektu __EventFilter použitého v registraci. Další informace najdete v tématu Implementace trvalých odběrů událostí mezi obory názvů.

     

  2. Zaregistrujte poskytovatele příjemce událostí v oboru názvů, kde se nacházejí třídy událostí.

    Rozhraní WMI používá poskytovatele příjemců událostí k nalezení trvalého příjemce události. Trvalý příjemce událostí je aplikace, kterou rozhraní WMI spustí při přijetí události. Pro registraci příjemce události poskytovatelé vytvářejí instance __EventConsumerProviderRegistration.

  3. Vytvořte instanci třídy, která představuje permanentního konzumenta událostí, kterého chcete použít.

    Třídy příjemce událostí jsou odvozeny od třídy __EventConsumer. Nastavte vlastnosti, které instance příjemce události vyžaduje.

  4. Zaregistrujte klienta pomocí nástroje regsvr32.

  5. Vytvořte instanci třídy filtru událostí __EventFilter.

    Nastavte požadovaná pole pro instanci filtru událostí. Požadovaná pole pro __EventFilter jsou Název, QueryLanguage, a Query. Vlastnost Name může být libovolný jedinečný název instance této třídy. Vlastnost QueryLanguage je vždy nastavená na WQL. Vlastnost Query je řetězec, který obsahuje dotaz události. Událost se vygeneruje, když selže dotaz trvalého příjemce událostí. Zdrojem události je WinMgmt, ID události je 10 a typ události je Chyba.

  6. Vytvořte instanci třídy __FilterToConsumerBinding pro přidružení logického příjemce události k filtru událostí.

    WMI používá přidružení k vyhledání spotřebitele události souvisejícího s událostí, která odpovídá kritériím zadaným ve filtru událostí. Rozhraní WMI používá zprostředkovatele příjemce událostí k vyhledání trvalé aplikace příjemce událostí, která se má spustit.