WMI - 直接访问 Win32_OperatingSystem 的单例实例
-
09-06-2019 - |
题
我在直接访问时遇到问题 Win32_操作系统 通过 WMI 公开的管理类。
它是一个单例类,我非常确定“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被抓住消息=“无效对象路径” source =“ system.management” stacktrace:at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorcode)在System.Management.Management.Management.Management.Initialize(boolean getObject)act System.Management.Management.ManagementBaseObject.get_wbase.get_wbemobject.get_wbemobject() 。
感谢您的回复。
缺口 - 我不知道该怎么做:)
乌鲁斯 - 我的印象是这是一个单例类,因为 这 MSDN 页面。此外,在 WBEMTest 实用程序中打开该类会显示 这.
实例对话框显示:“1 个对象”和“最多 1 个对象”批:1”在这些字段中并列出“Win32_OperatingSystem=@”
ManagementScope 已验证正常工作,所以我不知道发生了什么。我是 WMI 新手,但这似乎是最简单的用例之一!
解决方案
哇,世界正在改变。抱歉,我不知道您使用的是 Vista。如你看到的 这里, ,在 Windows XP 中情况有所不同。那么,当您单击“实例”按钮时会发生什么?
其他提示
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 可能是最简单的解决方案。
我刚刚尝试过这个简单的应用程序,运行良好
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% 确定答案,但是您是否尝试过使用 Reflector 来查看 ManagementObjectSearcher 的作用?它可能会给您一些关于您做错了什么的线索。
我可能会构造一个查询来获取 Primary = true 的实例。我有一段时间没有使用 Win32_OperatingSystem,但我似乎记得获得了多个实例,并且当前启动的实例的 Primary 等于 true。
邓肯写道:
实例对话框显示:“1 个对象”和“最多 1 个对象”批:1”在这些字段中并>列出“Win32_OperatingSystem=@”
看起来确实应该有效。您可以使用另一个单例类来测试您的代码,例如:
“Win32_Wmi设置=@”
看看你是否仍然遇到异常。