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

时间:2008-09-11 10:19:44

标签: c# windows-vista windows-xp wmi

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

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

调用InvokeMethod会产生问题底部列出的异常,访问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 =“无效的对象路径”   来源= “System.Management”   堆栈跟踪:   在System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)   在System.Management.ManagementObject.Initialize(Boolean getObject)   在System.Management.ManagementBaseObject.get_wbemObject()   在System.Management.ManagementObject.get_ClassPath()   在System.Management.ManagementObject.GetMethodParameters(String methodName,ManagementBaseObject& inParameters,IWbemClassObjectFreeThreaded& inParametersClass,IWbemClassObjectFreeThreaded& outParametersClass)   在System.Management.ManagementObject.InvokeMethod(String methodName,Object [] args)


感谢您的回复。

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

Uros - 由于this MSDN页面,我认为它是单身类。此外,在WBEMTest实用程序中打开该类会显示this


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

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

6 个答案:

答案 0 :(得分:2)

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可能是最简单的解决方案。

答案 1 :(得分:2)

我刚刚尝试过这个功能正常的简单应用

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下以管理员身份运行。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

  

Duncan写道:

     

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

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

“Win32_WmiSetting = @”

并查看您是否仍然获得例外。

答案 5 :(得分:0)

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