【问题标题】:Retrieving a descriptive value for WMI Win32_Processor.Family property instead of an index检索 WMI Win32_Processor.Family 属性的描述性值而不是索引
【发布时间】:2017-01-18 00:15:56
【问题描述】:

以下简单的 VBS 示例从 WMI 检索 CPU 标题、体系结构和系列:

s = ""
For Each Item In GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\Root\CIMV2").InstancesOf("Win32_Processor")
    s = s & "Caption = " & Item.Caption & vbCrLf
    s = s & "Architecture = " & Item.Architecture & vbCrLf
    s = s & "Family = " & Item.Family & vbCrLf
Next
WScript.Echo s

我的输出是:

Caption = Intel64 Family 6 Model 42 Stepping 7
建筑 = 9
家庭 = 198

我想要的是检索架构和系列的更多描述性值,而不是索引。此类属性具有Values 限定符,它指定属性的可能值列表,以及ValueMap 限定符,它指定Values 中相应字符串值的整数值。限定符显示在我用两个实用程序制作的屏幕截图中:

WMI 代码创建器

WMI CIM 工作室

在最后一个屏幕截图中,您可以看到 Win32_Processor 类、Architecture 属性、Values 限定符,其中包含六个字符串的数组:x86, MIPS, Alpha, PowerPC, ia64, x64,它对应于 ValueMap 限定符中数组的索引:@987654337 @。但是,以下代码未枚举在 WMI CIM Studio 中标记为已修改的限定符,例如 Description 和 Values,原因不明:

Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Processor")
s = ""
For Each objQualifier In objClass.Properties_("Architecture").Qualifiers_
    s = s & objQualifier.Name & " = "
    If IsArray(objQualifier.Value) Then 
        s = s & "{" & Join(objQualifier.Value, ", ") & "}"
    Else
        s = s & objQualifier.Value
    End If
    s = s & vbCrLf
Next
WScript.Echo s

我尝试在 x64 和 x86 主机上运行它,它返回相同的输出,如下所示:

CIMTYPE = uint16
映射字符串 = {WMI}
读=真
值映射 = {0, 1, 2, 3, 6, 9}

正如我所料:

CIMTYPE = uint16
说明 = Architecture 属性指定此平台使用的处理器架构。它返回以下整数值之一:
0 - x86
1 - MIPS
2 - 阿尔法
3 - PowerPC
6 - ia64
9 - x64
映射字符串 = {WMI}
读=真
值映射 = {0、1、2、3、6、9}
值 = {x86、MIPS、Alpha、PowerPC、ia64、x64}

我怎样才能获得这些限定词?有没有其他方法可以找回它们?

更新

感谢@Kul-Tigin 为我指明了正确的方向并提供了链接,我已经设法获得了所有属性限定符,包括修改。在访问限定符后,我从类中提取 Values 和 ValueMap 数组并创建一种转换表 oMap,用于将整数属性值转换为关联的字符串:

Const wbemFlagUseAmendedQualifiers = 131072
Set oService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\Root\CIMV2")
s = ""
For Each oInstance In oService.InstancesOf("Win32_Processor")
    For Each sName In Array("Caption", "Family")
        s = s & sName & " = " & oInstance.Properties_.Item(sName).Value & vbCrLf
    Next
Next
s = s & vbCrLf
Set oClass = oService.Get("Win32_Processor", wbemFlagUseAmendedQualifiers)
Set oProperty = oClass.Properties_.Item("Family")
aValues = oProperty.Qualifiers_.Item("Values")
aValueMap = oProperty.Qualifiers_.Item("ValueMap")
Set oMap = CreateObject("Scripting.Dictionary")
For i = 0 To UBound(aValues)
    oMap(aValueMap(i)) = aValues(i)
Next
For Each sKey In oMap
    s = s & sKey & " = " & oMap(sKey) & vbCrLf
Next
WScript.Echo s

我的输出如下:

Caption = Intel64 Family 6 Model 42 Stepping 7
Family = 198

1 = Other
2 = Unknown
3 = 8086
4 = 80286
5 = 80386
6 = 80486
7 = 8087
8 = 80287
9 = 80387
10 = 80487
11 = Pentium(R) brand
12 = Pentium(R) Pro
13 = Pentium(R) II
14 = Pentium(R) processor with MMX(TM) technology
15 = Celeron(TM)
16 = Pentium(R) II Xeon(TM)
17 = Pentium(R) III
18 = M1 Family
19 = M2 Family
24 = K5 Family
25 = K6 Family
26 = K6-2
27 = K6-3
28 = AMD Athlon(TM) Processor Family
29 = AMD(R) Duron(TM) Processor
30 = AMD29000 Family
31 = K6-2+
32 = Power PC Family
33 = Power PC 601
34 = Power PC 603
35 = Power PC 603+
36 = Power PC 604
37 = Power PC 620
38 = Power PC X704
39 = Power PC 750
48 = Alpha Family
49 = Alpha 21064
50 = Alpha 21066
51 = Alpha 21164
52 = Alpha 21164PC
53 = Alpha 21164a
54 = Alpha 21264
55 = Alpha 21364
64 = MIPS Family
65 = MIPS R4000
66 = MIPS R4200
67 = MIPS R4400
68 = MIPS R4600
69 = MIPS R10000
80 = SPARC Family
81 = SuperSPARC
82 = microSPARC II
83 = microSPARC IIep
84 = UltraSPARC
85 = UltraSPARC II
86 = UltraSPARC IIi
87 = UltraSPARC III
88 = UltraSPARC IIIi
96 = 68040
97 = 68xxx Family
98 = 68000
99 = 68010
100 = 68020
101 = 68030
112 = Hobbit Family
120 = Crusoe(TM) TM5000 Family
121 = Crusoe(TM) TM3000 Family
122 = Efficeon(TM) TM8000 Family
128 = Weitek
130 = Itanium(TM) Processor
131 = AMD Athlon(TM) 64 Processor Family
132 = AMD Opteron(TM) Family
144 = PA-RISC Family
145 = PA-RISC 8500
146 = PA-RISC 8000
147 = PA-RISC 7300LC
148 = PA-RISC 7200
149 = PA-RISC 7100LC
150 = PA-RISC 7100
160 = V30 Family
176 = Pentium(R) III Xeon(TM)
177 = Pentium(R) III Processor with Intel(R) SpeedStep(TM) Technology
178 = Pentium(R) 4
179 = Intel(R) Xeon(TM)
180 = AS400 Family
181 = Intel(R) Xeon(TM) processor MP
182 = AMD AthlonXP(TM) Family
183 = AMD AthlonMP(TM) Family
184 = Intel(R) Itanium(R) 2
185 = Intel Pentium M Processor
190 = K7
200 = IBM390 Family
201 = G4
202 = G5
203 = G6
204 = z/Architecture base
250 = i860
251 = i960
260 = SH-3
261 = SH-4
280 = ARM
281 = StrongARM
300 = 6x86
301 = MediaGX
302 = MII
320 = WinChip
350 = DSP
500 = Video Processor

我也在另一台电脑上尝试了代码:

Caption = AMD64 Family 21 Model 56 Stepping 1
Family = 72

...

MSDN about Standard Qualifiers 的使用细节很少:

值图
此限定符可以单独使用,也可以与 Values 限定符结合使用。当与 Values 限定符结合使用时,ValueMap 数组中的值的位置提供了 Values 数组中相应条目的位置。仅对字符串和整数值使用 ValueMap 限定符。在值映射数组中表示整数值的语法是 [+|=]digit[*digit]。内容、最大位数和表示的值受关联属性的类型限制。例如,uint8 可能没有符号,必须小于四位,并且必须表示小于 256 的值。

值
此属性还指定要映射到枚举属性的字符串值数组。此限定符可以应用于整数属性或字符串属性,并且映射可以是隐式或显式的。如果映射是隐式的,则整数或字符串属性值表示 Values 数组中的序数位置。如果映射是显式的,则属性必须是整数,并且有效的属性值列在由 ValueMap 限定符定义的数组中。有关详细信息,请参阅价值图。
如果不存在 ValueMap 限定符,则使用关联属性、方法返回类型或方法参数中的值对 Values 数组进行索引(相对于零)。如果存在 ValueMap 限定符,则值索引由值映射中属性值的位置定义。

现在我一直在检索适当的字符串,因为在ValueMap 限定符中既没有198 也没有72。

【问题讨论】:

标签: vbscript wmi wsh qualifiers


【解决方案1】:

答案是,Values/ValueMap 限定符字符串表不完整,不能使用。如果要将每个索引映射到字符串值,则必须自己创建此类表。

Win32_Processor 类的Family 属性的值来自处理器信息 SMBIOS 结构。值由 specification 定义(截至 2018 年 1 月的最新文档),第 46 页的表格包含所需的字符串:

198 - 英特尔® 酷睿™ i7 处理器

72 - AMD A 系列处理器

使用这些数据,您可以创建字符串表并维护它,因为新的 SMBIOS 版本中将引入新的处理器类型。

C++枚举形式的类似数据可以在here找到。

【讨论】:

  • 你是对的,我还想提一下 Win32_Processor 类的 Family 属性并不总是准确的,我的 CPU 是 Intel Pentium G2020 但是它报告Family 198(英特尔® 酷睿™ i7 处理器)
  • @kofifus 可能使用 Setup API,例如 SetupDiGetDevicePropertyW。它输出包含架构的设备友好名称属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2011-09-30
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
相关资源
最近更新 更多