我无法直接访问通过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新手,但这似乎是最简单的用例之一!
答案 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)