C#学习教程:使用WMI处理启动事件 – 未检测到所有进程启动分享


使用WMI处理启动事件 – 未检测到所有进程启动

我在Windows服务(运行为NT_AUTHORITYSYSTEM )中使用以下C#代码来创建用于接收进程创建事件的事件处理程序(使用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' 

( 如此Stack Overflow答案中所示 )

使用__InstanceCreationEventWin32_ProcessStartTrace之间是否有任何重大差异? 这可能是我问题的原因吗?

有没有解释为什么我没有收到所有流程启动的事件? 有什么比这更明显我在这里做错了吗?

两种方法都有效,但以不同的方式工作。

当您使用__InstanceCreationEvent WMI类时,您正在使用内部事件,这意味着您正在监视标准WMI数据模型中的更改(这类似于表中的触发器)。

当您使用Win32_ProcessStartTrace您正在使用外部事件,这意味着您正在使用为特定任务创建的专用事件类,在此情况下监视进程创建。

现在回到你的问题,避免某些事件“丢失”的最好方法是创建一个permanent event consumer

我发现当你得到一个进程已经开始的事件时 – 将该事件传递给一个单独的线程,例如boost线程,你可以将进程ID传递给一个新的线程。

这意味着WMI COM不会陷入困境并停止运行。

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

对于一些有用的C ++代码。

上述就是C#学习教程:使用WMI处理启动事件 – 未检测到所有进程启动分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/960037.html

发表评论

邮箱地址不会被公开。 必填项已用*标注