在WMI中的进程创建事件之后读取其他信息时滞后

时间:2012-08-16 16:20:44

标签: c# wmi

我正在尝试创建一个监视进程创建/终止的应用程序,并记录它执行的时间和最终记录在mysql db中的频率。我面临的问题是,我使用 Win32_ProcessStartTrace Win32_ProcessStopTrace 进行监控。创建进程后,立即使用Win32_Process查询其命令行。 对于那些快速退出的进程,进程创建和命令行查询 之间似乎存在“滞后”,因此我无法获取命令行。

有没有办法完成这项工作?

1 个答案:

答案 0 :(得分: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);
                }
            }
        }
    }
}