-->

流程启动事件中使用WMI - 并非所有的过程开始被发现(Process Start Event U

2019-07-28 23:14发布

我正在使用Windows服务(运行如下面的C#代码NT_AUTHORITY\SYSTEM )用于接收进程创建活动(使用WMI和WQL)创建事件处理程序:

string queryString = "SELECT * FROM Win32_ProcessStartTrace";
ManagementEventWatcher watcher = new ManagementEventWatcher(new WqlEventQuery(queryString));
watcher.EventArrived += new EventArrivedEventHandler(ProcessStartEvent);
watcher.Start();

ProcessStartEvent

int processId = int.Parse(e.NewEvent.Properties["ProcessId"].Value.ToString());
Process proc = Process.GetProcessById(processId);

Out("Received process: " + proc.ProcessName);

我遇到的问题是,(一些奇怪的原因) 并不是每一个过程的开始被捕获并通过程序报告。 如果我同时开始约6过程,一个可以不输出显示。

我试着做一些研究,攻克使用WMI进程创建的事件,但没有可用的有限信息。 我已经看到的是,还可以拍摄过程中使用类似的东西来开始:

SELECT TargetInstance
FROM __InstanceCreationEvent
WITHIN  2
WHERE TargetInstance ISA 'Win32_Process'

(曾经出现在这个堆栈溢出的答案 )

是否有使用之间的主要区别__InstanceCreationEventWin32_ProcessStartTrace ? 难道这是我的问题的原因是什么?

是否有一个解释,为什么我没有收到所有过程开始的事件? 有更多的东西很明显,我做错了什么?

Answer 1:

这两种方法都有效,但在型动物的方式工作。

当您使用__InstanceCreationEvent WMI类,你使用的是内在的事件,这意味着你所监测的标准WMI数据模型的变化(这就像在一个表中的触发器)。

当您使用Win32_ProcessStartTrace您使用的是外在的事件,这意味着你正在使用在这种情况下,一个特定的任务做了一个专门的事件类监视进程创建。

现在回到你的问题,避免了一些事件的“迷失”最好的办法就是建立一个permanent event consumer



Answer 2:

我发现,当你得到一个进程已经启动了一个事件 - 传递事件与例如升压线程可以将进程ID传递到一个新的线程一个单独的线程。

这意味着WMI COM不纠结获取并自行停止工作。

看到http://sourceforge.net/p/processhistory/code/HEAD/tree/trunk/PHLogger/COM_WMI_Consumer/

对于某些工作C ++代码。



文章来源: Process Start Event Using WMI - Not All Process Starts Being Detected