c# - C# 中的 WMI 查询在非英语机器上不起作用

标签 c# .net wmi wmi-query managementeventwatcher

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

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

这是失败的代码

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

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

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

非常感谢您的帮助!

马丁

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

最佳答案

显然是因为您指定的时间间隔太小了...我刚刚在法文版 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# - C# 中的 WMI 查询在非英语机器上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953434/

相关文章:

c# - 什么等同于 ASP.NET Core 中的 HostingEnvironment.ShutdownReason?

c# - Linq 根据存储在 SQL 中的字符串返回单个整数值

.net - 根据框大小绘制复选框刻度?

windows-7 - 有没有一种方法可以在不使用 PowerShell 或 CIM Studio 的情况下查询 WMI?

c# - 无法使用 WMI 和 C# 远程终止进程

c# - 在不构建的情况下使用 .NET 资源

c# - 直接从内存中将 WPF BitmapSources 保存为 h264 编码的视频

Python 不支持的操作数类型为 + :  'float'  and 'str

c# - SMO 恢复花了很长时间

.net - 使用 .NET 的稳定 RSS 阅读器