【问题标题】:WMI query in C# does not work on NON-English MachineC# 中的 WMI 查询在非英语机器上不起作用
【发布时间】:2011-05-10 16:43:01
【问题描述】:

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

我的代码可以完美运行,并且在英语机器上完全符合我的要求,但是当我在法语机器上运行相同的应用程序时它会失败。

这是失败的代码

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

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

它出现的错误是: “要求不可分析”

感谢您的帮助!

马丁

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

【问题讨论】:

  • 你确定它的语言环境是唯一的区别吗?操作系统版本和服务包呢?据我所知,如果可以解析查询,语言环境不会影响(英文错误是“Unparsable query”)。
  • 我不能 100% 确定,但是两台机器都有相同的 .net 3.5 并且都是开箱即用的新机器。他们也都在运行 Windows 7 启动器。我会看看能不能找到另一台机器,我可以用不同的语言开始测试。
  • 我有 2 台相同的笔记本电脑,并在一台以英语开头的笔记本电脑上进行了测试。所以肯定与机器启动的语言有关。

标签: c# .net wmi wmi-query managementeventwatcher


【解决方案1】:

显然是因为您指定的间隔太小...我刚刚在法语 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 查询...

【讨论】:

  • 哇,真烦人!我不得不承认,我并没有想到它会受到影响,因为它在英语上运行得非常好!好吧,你的答案是正确的,我把它改成了 1 秒,它就可以了。非常感谢
  • @SmithSmart:实际上这似乎是 WqlEventQuery 中与文化相关的错误,请参阅我的更新答案
  • 太棒了,如果可以的话,我会接受你的回答两次,能够在不到一秒的时间内签入有助于我检查启动进程,然后检查所有子进程。很好的信息。
  • 为什么不在connect.microsoft.com 提出一个错误,以便可以在框架中修复它。
  • @Pratik,我做到了,但我不得不离开,所以我没有立即发布链接...connect.microsoft.com/VisualStudio/feedback/details/667894/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多