Для инвентаризации свойств из WMI-класса Win32_BIOS необходимо вручную указать способ конвертации некоторых из них. Для этого такой вид инвентаризации необходимо оформить как PowerShell-скрипт. Обратим Ваше внимание на то, что WMI-свойство BiosCharacteristics имеет тип числового массива, поэтому сразу доставить человеко-читаемое значение характеристики путем выбора способа конвертации невозможно (консоль PowerShell тоже отображает значение этого свойства как числа). Одним из способов получить человеко-читаемое представление характеристик является выполнение маппинга внутри скрипта. Описания для каждого числового значения характеристики BIOS приведены на портале MSDN.
Такой инвентаризационный скрипт будет выглядеть следующим образом:
#Текстовые имена характеристик BIOS
#https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-bios
$CharacteristicNames = @{
# Описания не дескриптивны.
# 0 = "Reserved"; # Reserved
# 1 = "Reserved"; # Reserved
# 2 = "Unknown"; # Unknown
# Описания укорочены.
3 = "Not Supported"; # BIOS Characteristics Not Supported
4 = "ISA"; # ISA is supported
5 = "MCA"; # MCA is supported
6 = "EISA"; # EISA is supported
7 = "PCI"; # PCI is supported
8 = "PCMCIA"; # PC Card (PCMCIA) is supported
9 = "PnP"; # Plug and Play is supported
10 = "APM"; # APM is supported
11 = "BIOS Upgradeable"; # BIOS is Upgradeable
12 = "BIOS shadowing"; # BIOS shadowing is allowed
13 = "VL-VESA"; # VL-VESA is supported
14 = "ESCD"; # ESCD support is available
15 = "CD Boot"; # Boot from CD is supported
16 = "Selectable Boot"; # Selectable Boot is supported
17 = "ROM socketed"; # BIOS ROM is socketed
18 = "PCMCIA Boot"; # Boot From PC Card (PCMCIA) is supported
19 = "EDD"; # EDD (Enhanced Disk Drive) Specification is supported
20 = "NEC 9800 Floppy"; # Japanese Floppy for NEC 9800 1.2mb (3.5", 1k Bytes/Sector, 360 RPM) is supported
21 = "Toshiba 1.2mb Floppy"; # Japanese Floppy for Toshiba 1.2mb (3.5\", 360 RPM) is supported
22 = "5.25`" 360KB Floppy"; # 5.25"/360KB Floppy Services are supported
23 = "5.25`" 1.2MB Floppy"; # 5.25"/1.2MB Floppy Services are supported
24 = "3.5`" 720KB Floppy"; # 3.5"/720KB Floppy Services are supported
25 = "3.5`" 2.88 MB Floppy"; # 3.5"/2.88 MB Floppy Services are supported
26 = "Print Screen"; # Print Screen Service is supported
27 = "8042 Keyboard"; # 8042 Keyboard services are supported
28 = "Serial"; # Serial Services are supported
29 = "Printer"; # Printer services are supported
30 = "CGA/Mono Video"; # CGA/Mono Video Services are supported
31 = "NEC PC-98"; # NEC PC-98
32 = "ACPI"; # ACPI supported
33 = "USB Legacy"; # USB Legacy is supported
34 = "AGP"; # AGP is supported
35 = "I2O boot"; # I2O boot is supported
36 = "LS-120 boot"; # LS-120 boot is supported
37 = "ATAPI ZIP Drive Boot"; # ATAPI ZIP Drive boot is supported
38 = "1394 Boot"; # 1394 boot is supported
39 = "Smart Battery"; # Smart Battery supported
# Описания не дескриптивны.
# 40 = "Reserved for BIOS vendor"; # Reserved for BIOS vendor
# 47 = "Reserved for BIOS vendor"; # Reserved for BIOS vendor
# 48 = "Reserved for system vendor"; # Reserved for system vendor
# 63 = "Reserved for system vendor"; # Reserved for system vendor
}
# Функция преобразования массива числовых характеристик в массив текстовых характеристик.
function Get-CharacteristicsString($arr) {
# Объединение в единую строку через запятую.
(
$arr | % {
# Если есть текстовое имя для характеристики - возвращаем его.
# Если нет - возвращаем числовое значение характеристики.
$name = $CharacteristicNames[[int]$_];
if ($null -ne $name) { $name } else { $_ }
}
) -join ", "
}
# WMI-запрос с конвертацией.
Get-WmiObject -Class 'Win32_BIOS' -Namespace 'ROOT\CIMV2' |
% { @{
"Status" = $_.Status.ToString()
"Characteristics" = Get-CharacteristicsString($_.BiosCharacteristics)
"BIOSVersion" = $_.BIOSVersion -join ", "
"Serial" = $_.SerialNumber
"SMBIOSVersion" = "$($_.SMBIOSMajorVersion).$($_.SMBIOSMinorVersion)"
# Уже содержатся в других свойствах
#"Name" = $_.Name
#"Caption" = $_.Caption
#"Version" = $_.Version
#"SMBIOSBIOSVersion" = $_.SMBIOSBIOSVersion
} }


Язык PowerShell относится к классу строго типизированных языков.
Это означает, что переменные, результаты и параметры командлетов/функций могут относиться к большому спектру типов, как простых (строки, числа, логические значения), так и сложных (перечисления, структуры, массивы).
К сожалению, мощность объектной модели PowerShell превосходит мощность реляционной SQL структуры хранения данных, поэтому не любой результат PowerShell-выражения возможно представить в виде SQL-таблицы результатов, по крайней мере в автоматическом режиме.Данная особенность PowerShell не всегда бросается в глаза при интерактивной работе с ним из обычной текстовой консоли, поскольку сама консоль PowerShell выполняет преобразование большинства типов в человеко-читаемое представление, скрывая информацию о непосредственном типе. Поэтому вызывая практически любой командлет вручную из консоли PowerShell мы видим читаемый результат.
Такое преобразование в человеко-читаемое представление релевантно для интерактивной работы с консолью, поскольку позволяет человеку в меньшее количество действий получить желаемую информацию, не обращая внимания на ее внутреннюю структуру и не экономя место (на экране). Также стандартная консоль PowerShell выполняет обрезку длинных значений при их отображении.
При этом у инвентаризации Зодиак.АйТиЭм несколько другие задачи, а именно:
- не просто интерактивно вывести результат на экран, а доставить его на сервер и разместить в СУБД;
- предоставить табличные операции по работе с такими данными.
В такой постановке стратегия консоли PowerShell по выводу любых данных становится опасной, поскольку может привести к чрезмерному потреблению трафика для доставки данных с большого количества машин, получая при этом результат, слабо пригодный для табличных операций.
Поэтому мы приняли решение ограничить перечень типов PowerShell, которые автоматически конвертируются в читаемое представление и доставляются на сервер.