База знаний Зодиак.АйТиЭм

Инвентаризация BIOS

Инвентаризация свойств из WMI-класса Win32_BIOS через PowerShell-скрипт.

Инвентаризация BIOS

Для инвентаризации свойств из 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
        
    } }

bios1.png

bios2.png


Язык PowerShell относится к классу строго типизированных языков.
Это означает, что переменные, результаты и параметры командлетов/функций могут относиться к большому спектру типов, как простых (строки, числа, логические значения), так и сложных (перечисления, структуры, массивы).
К сожалению, мощность объектной модели PowerShell превосходит мощность реляционной SQL структуры хранения данных, поэтому не любой результат PowerShell-выражения возможно представить в виде SQL-таблицы результатов, по крайней мере в автоматическом режиме.

Данная особенность PowerShell не всегда бросается в глаза при интерактивной работе с ним из обычной текстовой консоли, поскольку сама консоль PowerShell выполняет преобразование большинства типов в человеко-читаемое представление, скрывая информацию о непосредственном типе. Поэтому вызывая практически любой командлет вручную из консоли PowerShell мы видим читаемый результат.

Такое преобразование в человеко-читаемое представление релевантно для интерактивной работы с консолью, поскольку позволяет человеку в меньшее количество действий получить желаемую информацию, не обращая внимания на ее внутреннюю структуру и не экономя место (на экране). Также стандартная консоль PowerShell выполняет обрезку длинных значений при их отображении.

При этом у инвентаризации Зодиак.АйТиЭм несколько другие задачи, а именно:

  • не просто интерактивно вывести результат на экран, а доставить его на сервер и разместить в СУБД;
  • предоставить табличные операции по работе с такими данными.

В такой постановке стратегия консоли PowerShell по выводу любых данных становится опасной, поскольку может привести к чрезмерному потреблению трафика для доставки данных с большого количества машин, получая при этом результат, слабо пригодный для табличных операций.

Поэтому мы приняли решение ограничить перечень типов PowerShell, которые автоматически конвертируются в читаемое представление и доставляются на сервер.