Python - Как получать события WMI асинхронно - PullRequest
0 голосов
/ 23 мая 2018

Я хочу получать события WMI асинхронно и обрабатывать их с помощью объекта SWbemSink. Microsoft предписывает вызвать IWbemServices.ExecNotificationQueryAsync, передав ему экземпляр SWbemSink.Когда происходит событие, оно доставляется в метод OnObjectReady объекта SWbemSink, чтобы клиент мог его обработать.Ниже приведен пример того, как сделать это в JS.Как мы можем сделать это в Python?Я знаю, как взаимодействовать с WMI с помощью win32com.client, но как реализовать сценарий Python, чтобы он выполнялся таким образом, управляемым событиями?

//Connects to default namespace (HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\Scripting\Default Namespace).
var wbemServices = GetObject("WinMgmts:{impersonationLevel=impersonate,(security)}"); 

//Create an event sink object.
var sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_");

//Register an event query describing which events the client would like
//to receive.
wbemServices.ExecNotificationQueryAsync(
    sink, "Select * From __InstanceOperationEvent within 0.5 Where TargetInstance ISA 'Win32_Process' and TargetInstance.Caption='explorer.exe'");

//Show a msg box to allow user to stop receiving events.    
var wshShell = WScript.CreateObject("WScript.Shell");
wshShell.Popup("Click OK to stop listening for events...");
sink.Cancel();


//SWbemSink function called every time an event is ready.
function SINK_OnObjectReady(wbemObject, asyncContext) {
    WScript.Echo("Event received: " + wbemObject.GetObjectText_());
}

1 Ответ

0 голосов
/ 24 мая 2018

Нашли решение:

Используйте wmi.WMI.watch_for ().См. wmi - Инструментарий управления Windows

...