编程语言
首页 > 编程语言> > C#中的WMI查询在NON-English Machine上不起作用

C#中的WMI查询在NON-English Machine上不起作用

作者:互联网

我正在创建一个应用程序,需要跟踪进程何时启动,然后在事件结束时引发事件.

我的代码运行完美,并且完全符合我在英语机器上的需要,但是当我在法语机器上运行相同的应用程序时,它就失败了.

这是失败的代码

qstart = new WqlEventQuery("__InstanceCreationEvent",
            new TimeSpan(0, 0, 0, 0, 5),
            "TargetInstance isa \"Win32_Process\"");

qstop = new WqlEventQuery("__InstanceDeletionEvent",
            new TimeSpan(0, 0, 0, 0, 5),
            "TargetInstance isa \"Win32_Process\"");
        try
        {
            using (wstart = new ManagementEventWatcher(qstart))
            {
                wstart.EventArrived += new EventArrivedEventHandler(ProcessStarted);
                Log.DebugEntry("BeginProcess() - Starting wstart Event");
                wstart.Start();
            }
        }
        catch (Exception ex)
        {
            Log.DebugEntry("error on wstart: " + ex.Message);
        }

        using (wstop = new ManagementEventWatcher(qstop))
        {
            wstop.EventArrived += new EventArrivedEventHandler(ProcessStopped);
            Log.DebugEntry("BeginProcess() - Starting wstop Event");
            wstop.Start();
        }

尝试启动查询时错误命中:
    wstart.Start();

并做同样的事情
    wstop.Start();

我只能猜测它与语言和查询字符串有关,但我抓着稻草.

它出现的错误是:
“demande non analysable”

感谢任何帮助!

马丁

编辑:在2台相同的机器上测试,唯一的区别是首次启动时选择的语言.

解决方法:

显然它是因为你指定的间隔太小了……我只是在法国的Windows XP SP3上试过它,并得到了同样的错误.但是,如果我改变间隔为1秒,它工作正常……似乎你不能指定一个小于1秒的间隔.不知道为什么这只发生在非英语操作系统上,但……

编辑:实际上我刚刚意识到它可能是WqlEventQuery中的一个错误. qstart.QueryString与CurrentCulture =“en-US”类似:

select * from __InstanceCreationEvent within 0.005 where TargetInstance isa "Win32_Process"

但是使用CurrentCulture =“fr-FR”,它看起来像这样:

select * from __InstanceCreationEvent within 0,005 where TargetInstance isa "Win32_Process"

(注意数字格式的差异)

显然,WqlEventQuery中的代码不强制使用不变文化格式化数字,使得查询在小数分隔符不是“.”的文化中不正确.

如果强制CurrentCulture为CultureInfo.Invariant,查询工作正常,即使在法语操作系统上也是如此.您也可以手动编写WQL查询…

标签:c,net,wmi,wmi-query,managementeventwatcher
来源: https://codeday.me/bug/20190518/1128202.html