WMI – 直接访问Win32_OperatingSystem的单例实例

我无法直接访问通过WMI公开的Win32_OperatingSystem管理类。

它是一个单例类,我很确定“Win32_OperatingSystem = @”是获取单例实例的正确路径语法。

对InvokeMethod的调用产生了问题底部列出的exception,访问ClassPath属性(注释行)也是如此。

我究竟做错了什么?

[我知道我可以使用ManagementObjectSearcher / ObjectQuery来返回Win32_OperatingSystem的集合(它只包含一个),但由于我知道它是一个单例,我想直接访问它。


ManagementScope cimv2 = InitScope(string.Format(@"\\{0}\root\cimv2", this.Name)); ManagementObject os = new ManagementObject( cimv2, new ManagementPath("Win32_OperatingSystem=@"), new ObjectGetOptions()); //ManagementPath p = os.ClassPath; os.InvokeMethod("Reboot", null); 

捕获了System.Management.ManagementException Message =“无效的对象路径”Source =“System.Management”StackTrace:位于System的System.Management.ManagementObject.Initialize(Boolean getObject)的System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)。 System.Management.ManagementObject.InvokeMethod(String methodName,System.Management.ManagementObject.GetMethodParameters(String methodName,ManagementBaseObject&inParameters,IWbemClassObjectFreeThreaded&inParametersClass,IWbemClassObjectFreeThreaded&outParametersClass)中的System.Management.ManagementObject.get_ClassPath()上的Management.ManagementBaseObject.get_wbemObject()对象[] args)


谢谢你的回复。

尼克 – 我不知道该怎么做:)

Uros – 由于这个 MSDN页面,我觉得它是一个单例类。 此外,在WBEMTest实用程序中打开该类会显示此信息 。


实例对话框显示:“1个对象”和“最大批量:1”在这些字段和列表中“Win32_OperatingSystem = @”

ManagementScope被validation为有效,所以我不知道是什么。 我是WMI新手,但这似乎是最简单的用例之一!

哇,世界正在发生变化。 对不起,我没有意识到你使用的是Vista。 正如您在此处所看到的,Windows XP中的情况有所不同。 那么,点击“Instances”按钮会发生什么?

Win32_OperatingSystem不是单例类 – 如果检查其限定符,您将看到没有为其定义Singleton限定符,因此您必须使用ManagementObjectSearcher.Get()或ManagementClass.GetInstances(),即使只有该类的一个实例。 Win32_OperatingSystem键属性是Name,因此可以使用选项直接获取实例

 ManagementObject OS = new ManagementObject(@"Win32_OperatingSystem.Name='OSname'") 

但根据我的经验,OSName总是这样:

“Microsoft Windows XP Professional | C:\ WINDOWS | \ Device \ Harddisk0 \ Partition1”

所以使用ManagementObjectSearcher可能是最简单的解决方案。

我刚试过这个简单的应用程序,运行正常

 using System; using System.Management; namespace WmiPlay { class Program { static void Main(string[] args) { try { ManagementScope cimv2 = new ManagementScope(@"\\.\root\cimv2"); ManagementObject os = new ManagementObject(cimv2, new ManagementPath("Win32_OperatingSystem=@"), new ObjectGetOptions()); Console.Out.WriteLine(os); } catch (Exception ex) { Console.Error.WriteLine(ex); } } } } 

看看这对你有用吗? 我确实在Visual Studio中运行它,我通常在Vista x64下以管理员身份运行。

我不是100%肯定答案,但您是否尝试使用reflection器来查看ManagementObjectSearcher的function? 它可能会给你一些关于你做错了什么的线索。

我可能会构造一个查询,获取Primary = true的实例。 我有一段时间没有使用Win32_OperatingSystem,但我似乎记得得到多个实例,而且当前启动的实例的Primary等于true。

邓肯写道:

实例对话框显示:“1个对象”和“最大批量:1”在这些字段中,>列表“Win32_OperatingSystem = @”

它确实看起来应该有效。 您可以使用另一个单例类测试您的代码,例如:

“Win32_WmiSetting = @”

并看看你是否仍然得到例外。