我在 Windows 服务(运行为NT_AUTHORITY\SYSTEM
)中使用以下 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'
(如this Stack Overflow answer中所见)
__InstanceCreationEvent
使用和之间有什么主要区别Win32_ProcessStartTrace
吗?这可能是我的问题的原因吗?
有没有解释为什么我没有收到所有流程开始的事件?我在这里做错了什么更明显的事情吗?