检索 WMI Win32_Processor.Family 属性的描述性值而不是索引

2024-02-01

下面的简单 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

对我来说输出是:

标题 = Intel64 Family 6 Model 42 Stepping 7
架构 = 9
家庭 = 198

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

WMI 代码创建器

WMI CIM 工作室

在最后一张截图中你可以看到Win32_Processor class, Architecture财产,Values限定符,包含六个字符串的数组:x86, MIPS, Alpha, PowerPC, ia64, x64它对应于数组中的索引ValueMap预选赛:0, 1, 2, 3, 6, 9。但是,下面的代码没有枚举 WMI CIM Studio 中标记为已修改的限定符,例如Description and 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}

我怎样才能获得该资格?还有其他方法可以找回它们吗?

UPDATE

我已经成功获得了所有属性限定符,包括修改后的限定符,感谢@Kul-Tigin 为我指明了正确的方向并提供了链接。获得预选赛资格后,我提取Values and 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 https://msdn.microsoft.com/en-us/library/aa393650(v=vs.85).aspx usage:

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

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

现在我陷入了检索适当的字符串的困境,因为也没有这样的索引198 nor 72 in ValueMap预选赛。


答案是,Values/ValueMap限定符字符串表不完整,无法使用。如果您想将每个索引映射到字符串值,您必须自己创建这样的表。

的价值Family的财产Win32_Processor类来自处理器信息 SMBIOS https://www.dmtf.org/standards/smbios结构。值定义为规格 https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.1.1.pdf(最新文档截至 2018 年 1 月),第 46 页的表格包含所需的字符串:

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

72 - AMD A 系列处理器

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

可以找到C++枚举形式的类似数据here https://github.com/fpmurphy/UEFI-Utilities/blob/master/showfirmware/SmBios.h.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检索 WMI Win32_Processor.Family 属性的描述性值而不是索引 的相关文章

  • 使用WMI远程卸载应用程序

    我正在尝试编写一个迷你 w32 可执行文件来使用 WMI 远程卸载应用程序 我可以使用下面的代码列出所有已安装的应用程序 但我找不到通过 WMI 和 C 远程卸载应用程序的方法 我知道我可以使用 msiexec 作为进程来执行相同的操作 但
  • 命令行参数 - 所需对象:'objshell.NameSpace(...)'

    我正在编写一个脚本 该脚本将利用 Windows 的内置功能来解压缩提供的 zip 文件 我对 vbscript 还很陌生 所以有些语法让我有点困惑 我正在使用一些现有代码并尝试修改它 以便它将采用命令行选项作为文件名 如果我使用命令行传递
  • 在 vbs 中比较两个字符串时,Trim 函数不会删除字符串末尾的空格

    我有一个简单的脚本 它需要两个字符串并比较它们 第一个末尾有一个空格 第二个则没有 Function compare str1 str2 dim a If strComp trim str1 trim str2 0 Then msgbox
  • 不使用 powershell 远程安装 .msi?

    我们有一个多服务器系统我们需要在客户端安装 我想编写一个脚本 可以 关闭远程机器上的服务 卸载多台远程计算机上的软件 在多个远程计算机上安装 msi 文件 我曾挣扎过psexec and wmic做第 2 点和第 3 点 似乎必须有一种更简
  • 使用 CFExecute 运行 VBScript 会引发错误,但通过命令行可以正常工作

    我正在尝试运行 VBScript 但 CFExecute 抛出错误
  • ADO 参数化查询不返回任何结果

    我正在使用此查询从经典 asp 页面中的 vbscript 获取一些结果 但它不会返回任何值 该页面是空白的 也没有错误 请问有什么建议吗 dim cmd admin no admin no request QueryString admi
  • VBScript 条件短路解决方法

    我有一个必须维护的大型经典 ASP 应用程序 并且我多次发现自己因缺乏短路评估能力而受挫 例如 VBScript 不会让你逃脱 if not isNull Rs myField and Rs myField lt gt 0 then 因为如
  • 如何为命令 net user 在列表中返回的每个用户运行批处理文件?

    我的目标是制作一个通用代码 循环遍历计算机中的所有用户帐户名称并将输出发送到批处理文件 net user 命令输出用户列表 但我想将每个用户名分配给一个参数 所以我应该使用for f命令去做 这可能看起来很简单 但请记住用户名可能在任何位置
  • 并排启动两个资源管理器窗口

    有没有办法使用批处理脚本并排 垂直平铺 启动两个资源管理器窗口 如果没有 我该如何使用 VBS 来做到这一点 我已经修改了上面的VBS脚本Hackoo完全按照OP的要求去做 脚本中的注释准确地解释了它将做什么 如果两个窗口未设置到正确位置
  • 如何获取 CD/DVD 驱动器上文件更改的通知?

    我是 C 新手 必须使用 C 开发 Windows 窗体应用程序 该应用程序应跟踪以下内容 监控外部和内部的 CD DVD 驱动器 监控 CD DVD 驱动器上创建 修改和删除的文件 我可以通过以下方式获取 CD DVD 驱动器插入的系统通
  • 如何删除已发布的 wmi 架构?

    我已经发布了架构 并且不再拥有包含发布该架构的 wmi 提供程序的 dll 如何删除架构 如果您正在谈论其他问题中的程序集 您可以简单地使用 wbemtest exe 连接到根命名空间 枚举实例 按钮 超类 名称 命名空间 删除名为 Tes
  • 由 VBScript 运行的 xPath 中的未知方法

    错误消息是 msxml3 dll 未知方法 Record CelloXml Integration Case ServiceEvent gt last 我的代码如下所示 错误出在案例上NEW Case OLD可以很好地配合 0 在那里 On
  • 如何将 VBScript 转换为可执行 (EXE) 文件? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我四处寻找转换 VBScript 的信息 vbs 到可执行文件 并意识到大多数可用的工具实际上是将脚本包装在可执行文件中 尝试了一些工
  • 顺序执行批处理文件

    dim shell x y x D d y c bat x set shell createobject wscript shell shell run y shell run a bat set shell nothing 当我运行此脚本
  • 使用 javascript 获取选择标签的名称

    我在任何地方都没有找到这个问题 所以我将其发布在这里 我有一堆选择标签 部分使用 VBScript 命名 我希望能够获取从 javascript 中的 onchange 事件调用的选择标签的名称 这是代码
  • 如何启动 VBS 的交互式控制台?

    与这个问题非常相似 如何启动 Perl 的交互式控制台 https stackoverflow com questions 73667 how can i start an interactive console for perl 我只是希
  • VBScript 中的对象/类字典

    vbscript 中是否可以有对象 类的字典 例如 Class employeeclass Public first last salary End Class Dim employeedict Set employeedict Creat
  • Powershell 设置盖子关闭操作

    我想自动设置 Windows 7 在我的工作笔记本电脑上合上盖子时所执行的操作 因为每次登录时都会通过 GPO 重置该操作 我知道我可以在批处理脚本中使用 powercfg 命令来实现此目的 powercfg setacvalueindex
  • 如何从 HTA 中启动批处理文件

    我有一个基本的 HTA 其中我尝试通过按钮启动批处理文件 但是当我尝试启动批处理文件时 它不会运行 当我按下按钮时 将启动命令提示符窗口 但不会运行脚本 这是代码的简单示例
  • VBScript:从 Scripting.Dictionary 中对项目进行排序

    我有下面的代码 它获取这样的数据 姓名 1 姓名 4 姓名 2 姓名 3 并像这样列出 是一个复选框 姓名 1 姓名 4 姓名 2 姓名 3

随机推荐