2

プロセスの作成/終了を監視し、実行時間とその頻度をログに記録するアプリを作成しようとしています。これは最終的にmysql dbに記録されます。私が直面している問題は、監視にWin32_ProcessStartTraceWin32_ProcessStopTraceを使用していることです。プロセスが作成されるとすぐに、そのコマンドラインは Win32_Process を使用して照会されます。プロセスの作成と、すぐに終了するプロセスのコマンドラインのクエリとの間に「ラグ」があるように見えるため、コマンドラインを取得できません。

これを行う方法はありますか?

4

1 に答える 1

4

このコードは、新しいプロセスの開始を監視し、使用されたコマンド ラインを出力します。

using System;
using System.Management;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            new Test().Run();
            Console.ReadLine();
        }
    }

    internal class Test
    {
        public void Run()
        {
            ProcessWatcher procWatcher = new ProcessWatcher();
            procWatcher.Start();
        }

        private class ProcessWatcher : ManagementEventWatcher
        {
            private const string wql = 
                   @"SELECT * FROM __InstanceCreationEvent WITHIN 1
                     WHERE TargetInstance ISA 'Win32_Process'";

            public ProcessWatcher()
            {
                this.Query.QueryLanguage = "WQL";
                this.Query.QueryString = wql;
                this.EventArrived += newProcessStarted;
            }

            private void newProcessStarted(object sender, 
                                           EventArrivedEventArgs e)
            {
                var process = e.NewEvent["TargetInstance"] 
                              as ManagementBaseObject;

                if (process != null)
                {
                    var cmdLine = process.Properties["CommandLine"].Value;
                    Console.WriteLine(cmdLine);
                }
            }
        }
    }
}
于 2012-08-16T16:45:54.923 に答える