В процессе работы любого ИТ специалиста бывают моменты, когда нужно получить информацию о системе. Иногда нужно собрать какой-то один или ряд параметров системы с множества рабочих станций и быстро обработать. Чем оперативнее сведения будут получены, тем конечно же лучше. В статье хочу представить powershell модуль, с помощью которого можно быстро получать почти любую информацию о системе. К примеру: мне удавалось собрать информацию о размере оперативной памяти с нескольких сотен рабочих станций, затратив на это чуть более двадцати секунд!
На просторах интернета можно найти большое количество powershell скриптов, получающих ту или иную информацию о системе. Как правило, это небольшие скрипты либо функции, использующие wmi. Для одной рабочей станции свою задачу они выполняют великолепно, но если компьютеров много, то наступают проблемы.
Основной недостаток в том, что сбор информации идет синхронно, скрипт не приступает к следующему компьютеру, пока не отработает на текущем. В результате для поучения информации со всего парка ПК, в лучшем случае, можно прождать очень много времени, в худшем же сценарий может зависнуть и не завершиться никогда.
Мне хотелось сделать какой-то универсальный инструмент. лишенный вышеперечисленного недостатка. Для удобства использования был написан powershell модуль, содержащий на данный момент одну функцию Get-Systeminfo.
На сегодняшний день функция позволяет получать множество различных сведений о системе. По сути, она содержит в себе большую коллекцию скриптов и легко может быть расширена путем добавления новых сценариев.
Install-Module -Name Systeminfo -Scope CurrentUser
Для других версий ссылка на Github
Основные характеристики функции
- Многопоточность
- Можно использовать протоколы DCOM и WSMAN для подключения к удаленному компьютеру
- Работа с конвейером (например, в домене можно запросить список компьютеров, используя командлет Get-Adcomputer с параметром -filter * передав по конвейеру результат его выполнения Get-Systeminfo, мы получим информацию со всех компьютеров домена)
- Легкая масштабируемость
Я не буду рассматривать технические аспекты того, как работает модуль. Вместо этого постараюсь понятно объяснить, как пользоваться и каким образом можно расширить функционал.
Как пользоваться функцией Get-SystemInfo
Работая с командлетом Get-Adcomputer, я обратил внимание на параметр Properties. Он позволял расширить стандартный вывод команды свойствами, которые были перечислены после него. Именно эта концепция была взята за основу. Например, для того чтобы запросить информацию о модели процессора и оперативной памяти, нужно после параметра Properties перечислить через запятую те свойства, которые мы хотим увидеть в результате выполнения.

Для группировки свойств используются switch параметры. Можно использовать совместно несколько switch параметров и параметр Properties


В процессе работы функции создаются две глобальные переменные $Result и $ErrorResult. Первая содержит компьютеры, с которых удалось получить информацию. Вторая содержит копьютеры, на которых произошли ошибки.
Данные переменные удобно использовать после того как функция отработала. Например, используя стандартный командлет Where-Object, можно выбрать из всех результатов те, которые отвечают определенным критериям.
Более подробные сведения и примеры можно получить, выполнив после установки модуля команду Get-Help Get-Systeminfo -Examples
Файл конфигурации
Функция Get-Systeminfo имеет файл конфигурации, находящийся в папке config. Он представляет из себя powershell скрипт, содержащий основные настройки. Наличие данного файла позволят вносить изменения в функцию, не редактируя основной код модуля. Для того чтобы расширить либо убрать ненужный функционал — нужно всего лишь изменить этот файл.
Основные переменные в файле.
$Defaultinfoconfig определяет, какая информация будет получена, когда функция будет запущена без каких-либо параметров. Добавляя или удаляя свойства из массива, можно настраивать какие сведения будут получены.
$Functionconfig содержит хэш таблицу. Где ключом является свойство, которое будет указываться в параметре Properties, а значением строка в стиле параметров powershell. В строке допустимы следующие параметры: Class, Query, Property, Script, FormatList
$ManualNamespace содержит хэш таблицу, где ключ-это класс, а значение- пространство имен, в котором находится класс. Изменения в таблицу нужно вносить в том случае, если нужный для работы класс не принадлежит пространству имен rootcimv2.
$Switchconfig содержит хэш таблицу: ключом является имя switch параметра, а значением-массив свойств.
Как расширить возможности функции
Предположим, что нужно добавить возможность получать наименование ос. Для этого требуется выполнить 4 действия.
- Придумать название, которое будет однозначно характеризовать то, что мы хотим получить. В данном случае назовем OsCaption.
- Внести изменения в блок параметров функции, отредактировав файл Systeminfo.psm1. Изменить нужно [ValidateSet()] для параметра Properties, добавив название, придуманное на первом шаге.
- Изменить файл конфигурации. Так как наименование ос можно получить через wmi обьект класса Win32_OperatingSystem (свойство caption)
Спойлер
нужно добавить в хэш таблицу $Functionconfig строку вида
OsCaption='-Class Win32_OperatingSystem -Property Caption'
- Если powershell запущен, и модуль был загружен: необходимо перезапустить консоль, либо выполнить Remove-Module Systeminfo
Выполнив четыре простых действия, мы получили новый функционал.

Не всегда представляется возможным получить нужные сведения напрямую из объекта wmi. Иногда для получения информации требуется обработать объекты нескольких классов. Для этих случаев необходимо писать скрипт.
Все скрипты модуля хранятся в папке Scripts. Ссылаться на них можно, используя параметр Script в хэш таблице $functionconfig. То есть, если бы в предыдущем примере требовался скрипт и ему для работы были нужны объекты нескольких классов, то строка для хэш таблицы приняла бы следующий вид
OsCaption='-Class Win32_OperatingSystem,Win32_ComputerSystem -Script Scriptfolderoscaptionscript.ps1’
После параметра Class нужно перечислить, объекты каких классов требуются для работы. В скрипте они будут доступны через переменные с аналогичным названием-в данном примере это $win32_operatingsystem и $win32_computersystem. Кроме этого во всех сценариях есть три служебных переменных-это $Computername, $Protocol и $Credential.
Скрипт для модуля ничем не отличается от обычного, кроме того, что не требуется использовать Get-Wmiobject, так как wmi объекты уже доступны через соответствующую переменную. Для протокола Dcom нужно учитывать, что вся информация должна быть получена через wmi. Не получится использовать командлеты get-process get-services и прочие подобные. Связано это с местом выполнения скриптов. В случае Dcom протокола все скрипты выполняются там, где запущена функция Get-Systeminfio.
Если для подключения используется протокол Wsman, скрипты выполняются на компьютере, с которого получаем информацию, поэтому нет никаких ограничений: можно использовать любые командлеты. Остальные нюансы использования файла конфигурации можно понять, изучив его подробно. Сейчас там находится множество примеров.
Модуль тестировался на второй и пятой версии powershell, но скорее всего будет работать и на всех остальных. Я рекомендую использовать 5 версию, так как там появилась функция авто дополнения, которая значительно облегчает работу.
Автор: SAGSa