【发布时间】:2015-03-06 11:33:23
【问题描述】:
我碰巧看到了代码here的以下部分。
$Obj.ExecNotificationQueryAsync($hObj, "SELECT * FROM __InstanceCreationEvent WITHIN 0.5 WHERE TargetInstance ISA 'Win32_Process'")
$Obj.ExecNotificationQueryAsync($hObj, "SELECT * FROM __InstanceDeletionEvent WITHIN 0.5 WHERE TargetInstance ISA 'Win32_Process'")
Switch $OB.Path_.Class
Case "__InstanceCreationEvent"
ConsoleWrite("+~>" & _ProcessGetPath($OB.TargetInstance.ProcessID) & @CR)
Case "__InstanceDeletionEvent"
ConsoleWrite("!~>" & $OB.TargetInstance.ProcessID & @CR)
EndSwitch
我使用相同的WQL 查询来监视C++ 中的进程。 C++ 中是否有类似的东西,通过它我可以知道它是创建还是终止进程。我尝试使用__CLASS,但它的输出为Win32_Process。我在MSVS2010 编码。
请帮忙。谢谢
编辑 1:添加 WQL 查询
hres = pSvc->ExecNotificationQueryAsync(
_bstr_t("WQL"),
_bstr_t("SELECT * "
"FROM __InstanceDeletionEvent WITHIN 1 "
"WHERE TargetInstance ISA 'Win32_Process' "),
WBEM_FLAG_SEND_STATUS,
NULL,
pStubSink);
hres = pSvc->ExecNotificationQueryAsync(
_bstr_t("WQL"),
_bstr_t("SELECT * "
"FROM __InstanceCreationEvent WITHIN 1 "
"WHERE TargetInstance ISA 'Win32_Process'"),
WBEM_FLAG_SEND_STATUS,
NULL,
pStubSink);
使用上面的代码,我从 IWbemObjectSink::Indicate 方法获取进程的名称,无论是创建的还是终止的,打印到控制台中。
【问题讨论】:
-
为每个查询设置单独的事件处理程序。如果 Creation 事件处理程序触发,则为创建,如果 Deletion 事件处理程序触发,则为终止
-
@stuartd:但是事件处理程序是否与事件发生时调用的
ExecNotificationQueryAsync函数(又调用Indicate函数)有关?此外,我的句柄在cpp文件中定义,与包含函数定义的文件不同。
标签: c++ process wmi wmi-query wql