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

时间:2020-03-05 18:51:20  来源:igfitidea点击:

我无法直接访问通过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 ="无效的对象路径"
Source =" 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(字符串methodName,ManagementBaseObject&inParameters,IWbemClassObjectFreeThreaded&inParametersClass,IWbemClassObjectFreeThreaded&outParametersClass)
在System.Management.ManagementObject.InvokeMethod(String methodName,Object [] args)中

感谢答复。

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

由于这个MSDN页面,我对Uros的印象是那是一个单例类。同样,在WBEMTest实用程序中打开类也显示了这一点。

实例对话框在这些字段中显示:" 1个对象"和"最大批次:1",并列出" Win32_OperatingSystem = @"

经验证,ManagementScope可以正常工作,所以我不知道怎么回事。我是WMI新手,但这似乎是最简单的用例之一!

解决方案

回答

我不确定答案是否100%,但是我们是否尝试过使用反射器查看ManagementObjectSearcher的功能?它可能会为我们提供一些有关我们做错了什么的线索。

回答

如果检查Win32_OperatingSystem的限定符,则它不是单例类,我们会看到没有为其定义单例限定符,因此即使只有一个,也必须使用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可能是最简单的解决方案。

回答

哇,世界在变化。抱歉,我没有意识到我们正在使用Vista。如我们所见,Windows XP中的情况有所不同。那么,当我们单击"实例"按钮时会发生什么?

回答

我可能会构造一个查询,以获取其中Primary = true的实例。我已经有一段时间没有使用Win32_OperatingSystem了,但是我似乎记得要获得多个实例,并且当前引导的实例的Primary等于true。

回答

Duncan wrote:
  
  The instances dialog shows: "1 objects" and "max. batch: 1" in those fields and >lists "Win32_OperatingSystem=@"

它肯定看起来像它应该工作。我们可以使用另一个单例类来测试代码,例如:

" Win32_WmiSetting = @"

看看是否仍然有异常。

回答

我刚刚尝试了这个运行良好的简单应用

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下运行。