Для инвентаризации состояния BitLocker необходимо выполнить ручное преобразование значения свойства ProtectionStatus в строку, например при помощи вызова метода ToString(). Одновременно с этим обратим Ваше внимание, что командлет Get-BitLockerVolume возвращает множественный результат (для каждого диска), поэтому с нашей точки зрения доставки одного лишь свойства ProtectionStatus недостаточно, необходимо еще хотя бы одно поле, описывающее диск, которому соответствует статус.
Get-BitLockerVolume | % { @{ "MountPoint" = $_.MountPoint; "ProtectionStatus" = $_.ProtectionStatus.ToString() } }
На первый взгляд может показаться, что необходимость в таком ручном преобразовании избыточна, но наш опыт показывает, что для ряда перечислимых типов их строковое представление может быть чрезмерно длинным или вообще отсутствовать. В таких случаях можно доставить на сервер числовое значение статуса и превратить его в человеко-читаемое при помощи механизма представлений Зодиак.АйТиЭм. Преобразование в числовой тип будет выглядеть следующим образом:
Get-BitLockerVolume | % { @{ "MountPoint" = $_.MountPoint; "ProtectionStatus" = [int]$_.ProtectionStatus } }
При использовании ручного маппинга можно сократить названия свойств возвращаемого объекта, что также позитивно скажется на потребляемом трафике при большом количестве машин:
Get-BitLockerVolume | % { @{ "mp" = $_.MountPoint; "ps" = [int]$_.ProtectionStatus } }
Язык PowerShell относится к классу строго типизированных языков.
Это означает, что переменные, результаты и параметры командлетов/функций могут относиться к большому спектру типов, как простых (строки, числа, логические значения), так и сложных (перечисления, структуры, массивы).
К сожалению, мощность объектной модели PowerShell превосходит мощность реляционной SQL структуры хранения данных, поэтому не любой результат PowerShell-выражения возможно представить в виде SQL-таблицы результатов, по крайней мере в автоматическом режиме.Данная особенность PowerShell не всегда бросается в глаза при интерактивной работе с ним из обычной текстовой консоли, поскольку сама консоль PowerShell выполняет преобразование большинства типов в человеко-читаемое представление, скрывая информацию о непосредственном типе. Поэтому вызывая практически любой командлет вручную из консоли PowerShell мы видим читаемый результат.
Такое преобразование в человеко-читаемое представление релевантно для интерактивной работы с консолью, поскольку позволяет человеку в меньшее количество действий получить желаемую информацию, не обращая внимания на ее внутреннюю структуру и не экономя место (на экране). Также стандартная консоль PowerShell выполняет обрезку длинных значений при их отображении.
При этом у инвентаризации Зодиак.АйТиЭм несколько другие задачи, а именно:
- не просто интерактивно вывести результат на экран, а доставить его на сервер и разместить в СУБД;
- предоставить табличные операции по работе с такими данными.
В такой постановке стратегия консоли PowerShell по выводу любых данных становится опасной, поскольку может привести к чрезмерному потреблению трафика для доставки данных с большого количества машин, получая при этом результат, слабо пригодный для табличных операций.
Поэтому мы приняли решение ограничить перечень типов PowerShell, которые автоматически конвертируются в читаемое представление и доставляются на сервер.