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

本文关键字:英语 计算机 不起作用 中的 WMI 查询 | 更新日期: 2023-09-27 17:56:15

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

我的

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

这是失败的代码

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();
        }
尝试

启动查询时出现错误: 哗啦啦。开始();

并做同样的事情 哗啦啦。开始();

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

它出现的错误是:"需求不可分析"

任何帮助都非常感谢!

马丁

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

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

显然

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