Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Asynchronní oznámení událostí je technika, která aplikaci umožňuje neustále monitorovat události bez monopolizace systémových prostředků. Asynchronní oznámení událostí mají stejná omezení zabezpečení jako ostatní asynchronní volání. Místo toho můžete provádět polosynchronní volání. Další informace naleznete v tématu Volání metody.
Fronta asynchronních událostí směrovaných do klienta se může mimořádně zvětšit. Rozhraní WMI proto implementuje celosystémovou zásadu, aby se zabránilo vyčerpání paměti. Rozhraní WMI buď zpomalí události, nebo začne vyřazovat události z fronty, když velikost fronty překročí určitou mez.
Rozhraní WMI využívá vlastnosti LowThresholdOnEvents a HighThresholdOnEvents třídy Win32_WMISetting k nastavení limitů pro zabránění nedostatku paměti. Minimální hodnota označuje, kdy má rozhraní WMI začít zpomalovat oznámení o událostech, a maximální hodnota označuje, kdy se mají události začít vyřazovat. Výchozí hodnoty pro nízké a vysoké prahové hodnoty jsou 1 000000 (10 MB) a 2000000 (20 MB). Kromě toho můžete nastavit vlastnost MaxWaitOnEvents, abyste popsali množství času, po který má rozhraní WMI čekat před vyřazením událostí. Výchozí hodnota pro MaxWaitOnEvents je 2000 nebo 2 sekundy.
Příjem asynchronních oznámení událostí ve VBScriptu
Skriptovací volání pro příjem oznámení událostí jsou v podstatě stejná jako všechna asynchronní volání se stejnými problémy se zabezpečením. Další informace naleznete v tématu Vytvoření asynchronního volání pomocí jazyka VBScript.
Příjem oznámení asynchronních událostí ve skriptu VBScript
Vytvořte objekt typu 'sink' voláním WScript.CreateObject a zadáním progID "WbemScripting" a typu objektu SWbemSink. Objekt jímky obdrží oznámení.
Napište podprogram pro každou událost, kterou chcete zpracovat. Následující tabulka uvádí události SWbemSink.
Událost Význam OnObjectReady Zaznamenává vrácení objektu do jímky. Při použití tohoto volání se pokaždé vrátí jeden objekt, dokud nebude operace dokončena. Po dokončení Zprávy při dokončení asynchronního volání. K této události nikdy nedojde, pokud je operace neomezená. OnObjectPut Zaznamenává dokončení asynchronní operace vložení. Tato událost vrátí cestu objektu instance nebo uložené třídy. onProgress Zaznamenává stav asynchronního volání, které probíhá. Ne všichni poskytovatelé podporují průběžné zprávy o průběhu. Zrušit Zruší všechny nevyřízené asynchronní operace spojené s tímto přijímačem objektů.
Následující příklad kódu VBScript upozorní na odstranění procesů s intervalem sledování 10 sekund. V tomto skriptu podprogram SINK_OnObjectReady zpracovává výskyt události. V příkladu má objekt jímky název Jímka, ale tento objekt můžete pojmenovat podle potřeby.
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set MySink = WScript.CreateObject( _
"WbemScripting.SWbemSink","SINK_")
objWMIservice.ExecNotificationQueryAsync MySink, _
"SELECT * FROM __InstanceDeletionEvent" _
& " WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'"
WScript.Echo "Waiting for events..."
While (True)
Wscript.Sleep(1000)
Wend
Sub SINK_OnObjectReady(objObject, objAsyncContext)
Wscript.Echo "__InstanceDeletionEvent event has occurred."
End Sub
Sub SINK_OnCompleted(objObject, objAsyncContext)
WScript.Echo "Event call complete."
End Sub
Příjem asynchronních oznámení událostí v jazyce C++
Chcete-li provést asynchronní oznámení, vytvoříte samostatné vlákno výhradně pro monitorování a příjem událostí z rozhraní WMI (Windows Management Instrumentation). Když toto vlákno obdrží zprávu, vlákno upozorní vaši hlavní aplikaci.
Když vyhradíte samostatné vlákno, umožníte hlavnímu procesu provádět další aktivity při čekání na doručení události. Asynchronní doručování oznámení zlepšuje výkon, ale může poskytovat méně zabezpečení, než chcete. V jazyce C++ máte možnost použít rozhraní IWbemUnsecuredApartment nebo provádět kontroly přístupu u popisovačů zabezpečení. Další informace naleznete v tématu Nastavení zabezpečení asynchronního volání.
Nastavení asynchronních oznámení událostí
Před inicializací všech asynchronních oznámení se ujistěte, že jsou parametry zabránění nedostatku paměti správně nastaveny v Win32_WMISetting.
Určete, jaký druh událostí chcete přijmout.
Rozhraní WMI podporuje vnitřní a vnější události. Vnitřní událost je událost předdefinovaná rozhraním WMI, zatímco extrinsická událost je událost definovaná poskytovatelem třetí strany. Další informace najdete v části Jak určit typ události, kterou chcete přijmout.
Následující postup popisuje, jak přijímat asynchronní oznámení událostí v jazyce C++.
Příjem asynchronních oznámení událostí v jazyce C++
Nastavte aplikaci pomocí volání funkcí CoInitializeEx a CoInitializeSecurity.
Volání CoInitializeEx inicializuje COM, zatímco CoInitializeSecurity uděluje rozhraní WMI oprávnění volat do procesu uživatele. Funkce CoInitializeEx také umožňuje programovat vícevláknovou aplikaci, která je nezbytná pro asynchronní oznámení. Další informace naleznete v tématu Zajištění zabezpečení WMI.
Kód v tomto tématu vyžaduje pro správnou kompilaci následující odkazy a příkazy #include.
#define _WIN32_DCOM #include <iostream> using namespace std; #include <wbemidl.h>Následující příklad kódu popisuje, jak nakonfigurovat dočasného příjemce událostí pomocí volání CoInitializeEx a CoInitializeSecurity.
void main(int argc, char **argv) { HRESULT hr = 0; hr = CoInitializeEx (0, COINIT_MULTITHREADED); hr = CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); if (FAILED(hr)) { CoUninitialize(); cout << "Failed to initialize security. Error code = 0x" << hex << hr << endl; return; } // ... }Vytvořte objekt jímky prostřednictvím rozhraní IWbemObjectSink.
Rozhraní WMI používá IWbemObjectSink k zasílání oznámení o událostech a k hlášení stavu asynchronní operace nebo události.
Zaregistrujte příjemce událostí pomocí volání metody IWbemServices::ExecNotificationQueryAsync.
Ujistěte se, že pResponseHandler parametr odkazuje na objekt jímky vytvořený v předchozím kroku.
Účelem registrace je přijímat pouze požadovaná oznámení. Příjem nadbytečných oznámení plýtvá časem na zpracování a doručení a nevyužívá plně možnost filtrování rozhraní WMI.
Dočasný příjemce však může obdržet více než jeden typ události. V tomto případě musí dočasný příjemce provádět samostatná volání IWbemServices::ExecNotificationQueryAsync pro každý typ události. Příjemce může například vyžadovat oznámení při vytvoření nových procesů (událost vytvoření instance nebo __InstanceCreationEvent) a pro změny určitých klíčů registru (událost registru, například RegistryKeyChangeEvent). Příjemce proto provede jedno volání ExecNotificationQueryAsync k registraci událostí vytváření instancí a dalším voláním ExecNotificationQueryAsync pro registraci událostí registru.
Pokud se rozhodnete vytvořit příjemce událostí, který registruje více událostí, měli byste se vyhnout registraci více tříd ve stejné jímce. Místo toho použijte samostatnou jímku pro každou třídu registrované události. Vyhrazený dřez zjednodušuje zpracování a pomáhá při údržbě, takže můžete zrušit jednu registraci, aniž by to mělo vliv na ostatní.
Proveďte veškeré nezbytné aktivity ve svém příjemci událostí.
Tento krok by měl obsahovat většinu kódu a zahrnovat například aktivity, jako je zobrazení událostí v uživatelském rozhraní.
Po dokončení odregistrujte dočasného příjemce události voláním metody IWbemServices::CancelAsyncCall.
Bez ohledu na to, zda je volání CancelAsyncCall úspěšné nebo ne, neodstraňujte objekt jímky, dokud počet referencí na objekt nedosáhne nuly. Další informace naleznete v tématu Volání metody.