C#中的WMI查询在非英语计算机上不起作用

C#中的WMI查询在非英语计算机上不起作用,c#,.net,wmi,wmi-query,managementeventwatcher,C#,.net,Wmi,Wmi Query,Managementeventwatcher,我正在创建一个应用程序,它需要跟踪流程何时启动,然后在流程完成时引发一个事件 我的代码工作得非常完美,在英语机器上完全可以满足我的需要,但当我在法语机器上运行相同的应用程序时,它失败了 下面是失败的代码 qstart = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 0, 0, 5), "TargetInstance isa \"Win32_Process\"");

我正在创建一个应用程序,它需要跟踪流程何时启动,然后在流程完成时引发一个事件

我的代码工作得非常完美,在英语机器上完全可以满足我的需要,但当我在法语机器上运行相同的应用程序时,它失败了

下面是失败的代码

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()

我只能猜测它与语言和查询字符串有关,但我正在抓救命稻草

它出现的错误是: “需方不可分析”

感谢您的帮助

马汀


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

显然这是因为您指定的间隔太小。。。我刚在法国的WindowsXPSP3上试用过,结果也出现了同样的错误。但是如果我把间隔改为1秒,效果很好。。。似乎无法指定小于1秒的间隔。不知道为什么这只发生在非英语操作系统上,不过

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

但使用CurrentCulture=“fr fr”时,看起来是这样的:

select * from __InstanceCreationEvent within 0,005 where TargetInstance isa "Win32_Process"
(注意数字格式中的差异)

因此,
WqlEventQuery
中的代码显然没有强制使用不变区域性来格式化数字,这使得在十进制分隔符不为“”的区域性中的查询不正确


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

您确定唯一的区别是语言环境吗?操作系统版本和服务包呢?据我所知,如果一个查询可以被解析,语言环境将不会产生影响(英文错误是“Unparsable query”)。我不能100%确定,但这两台机器都有相同的.net 3.5,而且都是开箱即用的新机器。他们也都在运行Windows7Starter。我会看看是否能找到另一台可以用不同语言启动的机器进行测试。我有两台相同的笔记本电脑,并在一台用英语启动的电脑上进行了测试。这肯定与机器的启动语言有关。哇,真烦人!我必须承认,我没有想到它会受到影响,因为它在英语方面做得非常好!嗯,你们的答案是正确的,我把它改为1秒,它就可以工作了。大量的thanks@SmithSmart:实际上,这似乎是WqlEventQuery中与区域性相关的错误,请参阅我的更新答案。如果可以,我会接受您的答案两次。在检查启动进程然后检查所有子进程时,能够在不到一秒钟的时间内签入帮助很大。非常好的信息。你为什么不在上提出一个bug,以便在框架中修复它。@Pratik,我提出了,但我不得不离开,所以我没有立即发布链接。。。
select * from __InstanceCreationEvent within 0,005 where TargetInstance isa "Win32_Process"