8

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ますか?これが私の問題の原因でしょうか?

すべてのプロセス開始でイベントを受信しない理由についての説明はありますか?私がここで間違っていることをもっと明白にしていますか?

4

2 に答える 2

8

どちらの方法も有効ですが、異なる方法で機能します。

__InstanceCreationEventWMI クラスを使用する場合、組み込みイベントを使用していることになります。これは、標準の WMI データ モデルの変更を監視していることを意味します (これは、テーブル内のトリガーのように機能します)。

を使用するWin32_ProcessStartTrace場合、外部イベントを使用しています。つまり、特定のタスク用に作成された特殊なイベント クラスを使用していることを意味します。この場合、プロセスの作成を監視します。

問題に戻ると、一部のイベントの「損失」を回避する最善の方法は、permanent event consumer.

于 2012-04-13T15:50:30.267 に答える