3

这是一个复杂的想法,我希望你能忍受我,因为它的表达很困难。

似乎某些 WMI 类具有可以查询的原始值,而其他类则没有。这具有现实意义。

演示 1

以Win32_Processor类为例。据我所知,它的原始值是其实例DeviceID列的值。例如,这允许使用整洁的单行查询正在运行的操作系统的体系结构(32 / 64 位),例如这个 JScript 示例:

var arch = GetObject("winmgmts:root\\cimv2:Win32_Processor='cpu0'").AddressWidth

在该示例中,GetObject充当一种select instance where primitive value="cpu0"并返回单个实例,而不是集合。这按预期工作。

演示 2

另一方面,Win32_OperatingSystem类没有我能找到的原始值。与Win32_ProcessorDeviceID列一样,MSDN 文档Win32_OperatingSystem声称该CreationClassName列是表的key字段。

假设可以预见,CreationClassName=="Win32_OperatingSystem"。因此,有人可能会推断出类似的单行代码可以这样写:

var arch = GetObject("winmgmts:root\\cimv2:Win32_OperatingSystem='Win32_OperatingSystem'").OSArchitecture

但是,这会导致错误。 我在使用其他列值的反复试验尝试同样都失败了。.columname在类名和类名之间附加=也会导致语法错误。

据我所知,Win32_OperatingSystem如果不枚举所有实例,就无法识别类的单个实例,即使只有一个实例要枚举。

var wmi = GetObject("winmgmts:");
var os = wmi.ExecQuery("select OSArchitecture from Win32_OperatingSystem");
for (var res = new Enumerator(os); !res.atEnd(); res.moveNext()) {
    var arch = res.item().OSArchitecture;
}

这些行可以在某种程度上组合:

var os = GetObject("winmgmts:").ExecQuery("select OSArchitecture from Win32_OperatingSystem");
var arch = new Enumerator(os).item().OSArchitecture;

...但是直接在其中查询实例仍然很好,Win32_OperatingSystem而不必列举令人讨厌的残留层次结构。

问题

如何预测 WMI 类是否具有可查询的原始值,以及哪一列包含该值?

4

2 回答 2

2

您正在寻找的是“关键”属性。

http://blogs.msdn.com/b/powershell/archive/2008/04/15/wmi-object-identifiers-and-keys.aspx

于 2013-04-05T17:19:39.650 回答
1

powershell中,Get-WmiObject cmdlet(或gwmi别名)提供了一些在 MSDN 中不明显或不易获得的见解。通过查询类时,类之间gwmi存在一些差异,这些差异要么不好,要么根本没有在其他地方记录(或至少不容易搜索)。以以下powershell会话为例:

在此处输入图像描述

您会看到Win32_Processor该类具有__RELPATH__PATH属性,这些属性引用了该类的原始值CPU0; 而Win32_OperatingSystem该类没有这样的属性。

这可能是一个强有力的提示,有助于确定您希望查询的类是否必须在被解析之前被完全枚举。

于 2013-04-05T14:13:27.153 回答