2017-01-18 5 views
2

В приведенном ниже простом примере VBS извлекает заголовок процессора, архитектуру и семью от WMI:Получения описательного значения для WMI Win32_Processor.Family собственности вместо индекса

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 Семейный 6 Модель 42 Шаговый 7
Архитектура = 9
Семейный = 198

Я хочу получить более описательные значения для архитектуры и семьи вместо индексов. Такие свойства имеют квалификатор Values, который задает список возможных значений для свойства и квалификатор ValueMap, который задает целочисленные значения соответствующих строковых значений в Values. Это отборочные показаны на скриншотах, которые я сделал из двух утилит:

WMI Code Creator

wmi_code_creator

WMI CIM Студия

wmi_cim_studio

На последнем скриншоте вы можете увидеть Win32_Processor класс , Architecture propertytry, Values квалификатор, содержащий массив из шести строк: x86, MIPS, Alpha, PowerPC, ia64, x64, который соответствует e индексы из массива в ValueMap отборочный: 0, 1, 2, 3, 6, 9. Однако приведенный ниже код не перечисляет отборочные отмеченные с поправками в 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
MappingStrings = {WMI}
чтения = True
ValueMap = {0, 1, 2, 3, 6, 9}

В то время как я ожидал:

CIMTYPE = uint16
Описание = Свойство Архитектура определяет архитектуру процессора, используемого этой платформы.Она возвращает одно из следующих значений целочисленных:
0 - x86
1 - MIPS
2 - Альфа
3 - PowerPC
6 - IA64
9 - 64
MappingStrings = {WMI}
чтения = Правда
ValueMap = {0, 1, 2, 3, 6, 9}
Значения = {x 86, MIPS, Alpha, PowerPC, ia64, x64}

Как я могу получить эти квалификаторы? Есть ли другой способ их получить?

UPDATE

мне удалось получить все отборочные собственности, в том числе внесены изменения, благодаря @ Кул-Тегина указал мне в правильном направлении и предоставления ссылок. Имея доступ к классификаторам, я извлекаю 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 использования:

ValueMap
Этот классификатор можно использовать отдельно или в комбинации с классификатором Values. При использовании в сочетании с квалификатором Values ​​местоположение значения в массиве ValueMap предоставляет местоположение соответствующей записи в массиве Values. Используйте квалификатор ValueMap только со строковыми и целочисленными значениями. Синтаксис для представления целочисленного значения в массиве значений значений [+ | =] digit [* digit]. Содержимое, максимальное количество цифр и представленное значение ограничены типом связанного с ним свойства. Например, uint8 не может быть подписано, должно быть меньше, чем четыре цифры, и должен представлять значение меньше чем 256.

Значения
Это свойство также указывает массив строковых значений для отображения на свойстве перечисления , Этот квалификатор может применяться как к целочисленному, так и к строковому свойству, а отображение может быть неявным или явным. Если отображение является неявным, значения целочисленного или строкового значения представляют порядковые позиции в массиве Значения. Если сопоставление является явным, свойство должно быть целым, а допустимые значения свойств перечислены в массиве, определенном квалификатором ValueMap. Для получения дополнительной информации см. Карту значений.
Если квалификатор ValueMap отсутствует, массив Values ​​индексируется (с нулевым относительным), используя значение в ассоциированном свойстве, методе возврата метода или параметре метода. Если присутствует квалификатор ValueMap, индекс значений определяется положением значения свойства в карте значений.

Теперь я застрял в получении соответствующей строки, так как нет такого индекса ни 198, ни 72 в ValueMap классификатором.

+0

Возможный дубликат [получить описание из класса WMI с помощью vbscript] (http://stackoverflow.com/a/3981101/893670) –

+1

Также см. [WbemFlagEnum] (https://msdn.microsoft.com/ru -us/library/aa393980 (v = vs.85) .aspx) для 'wbemFlagUseAmendedQualifiers' –

ответ

0

Ответ: Values/ValueMap Таблица строк классификатора является неполной и не может быть использована. Вы должны создать такую ​​таблицу самостоятельно, если вы хотите сопоставить каждый индекс с строковым значением.

Значение Family имущества Win32_Processor класса происходит от процессора ИнформацииSMBIOS структуры. Значения определяются specification (последний документ по состоянию на январь 2018 года), в таблице на 46-й странице, содержит необходимые строки:

198 - процессор Intel® Core ™ i7

72 - AMD A-Series Processor

Используя эти данные, вы можете создать таблицу строк и поддерживать ее в качестве новых типов процессоров, используя новые версии SMBIOS.

Аналогичные данные в виде перечня C++ можно найти here.

Смежные вопросы