Я использую следующий код C# в службе Windows (которая запускается как 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'
(как показано в этом Stack Ove rflow answer)
Существуют ли существенные различия между использованием __InstanceCreationEvent
и Win32_ProcessStartTrace
? Может ли это быть причиной моих проблем?
Есть ли объяснение, почему я не получаю событиядля всехпроцессов? Есть ли что-то более очевидное, что я делаю неправильно здесь?