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つのプロセスを同時に開始すると、1つが出力に表示されない場合があります。
WMIを使用してプロセス作成イベントをキャプチャすることについていくつかの調査を試みましたが、利用できる情報は限られています。次のようなものを使用して、プロセスの開始をキャプチャすることも可能であることがわかりました。
SELECT TargetInstance
FROM __InstanceCreationEvent
WITHIN 2
WHERE TargetInstance ISA 'Win32_Process'
(このスタックオーバーフローの回答に見られるように)
との使用に大きな違いは__InstanceCreationEvent
ありWin32_ProcessStartTrace
ますか?これが私の問題の原因でしょうか?
すべてのプロセス開始でイベントを受信しない理由についての説明はありますか?私がここで間違っていることをもっと明白にしていますか?