WMI-直接访问Win32_OperatingSystem的单例实例
我无法直接访问通过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下运行。