Хабрахабр

[Из песочницы] Бесплатно, быстро, легко и просто получаем информацию о системе с множества ПК в сети

В процессе работы любого ИТ специалиста бывают моменты, когда нужно получить информацию о системе. Иногда нужно собрать какой-то один или ряд параметров системы с множества рабочих станций и быстро обработать. Чем оперативнее сведения будут получены, тем конечно же лучше. В статье хочу представить powershell модуль, с помощью которого можно быстро получать почти любую информацию о системе. К примеру: мне удавалось собрать информацию о размере оперативной памяти с нескольких сотен рабочих станций, затратив на это чуть более двадцати секунд!
На просторах интернета можно найти большое количество powershell скриптов, получающих ту или иную информацию о системе. Как правило, это небольшие скрипты либо функции, использующие wmi. Для одной рабочей станции свою задачу они выполняют великолепно, но если компьютеров много, то наступают проблемы.

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

лишенный вышеперечисленного недостатка. Мне хотелось сделать какой-то универсальный инструмент. Для удобства использования был написан powershell модуль, содержащий на данный момент одну функцию Get-Systeminfo.

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

Информация для скачивания и установки

Если у вас powershell 5 версии или выше — установить модуль можно выполнив команду

Install-Module -Name Systeminfo -Scope CurrentUser

Для других версий ссылка на Github

Основные характеристики функции

  • Многопоточность
  • Можно использовать протоколы DCOM и WSMAN для подключения к удаленному компьютеру
  • Работа с конвейером (например, в домене можно запросить список компьютеров, используя командлет Get-Adcomputer с параметром -filter * передав по конвейеру результат его выполнения Get-Systeminfo, мы получим информацию со всех компьютеров домена)
  • Легкая масштабируемость

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

Как пользоваться функцией Get-SystemInfo

Работая с командлетом Get-Adcomputer, я обратил внимание на параметр Properties. Он позволял расширить стандартный вывод команды свойствами, которые были перечислены после него. Именно эта концепция была взята за основу. Например, для того чтобы запросить информацию о модели процессора и оперативной памяти, нужно после параметра Properties перечислить через запятую те свойства, которые мы хотим увидеть в результате выполнения.

Пример работы

image

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

Пример работы

image
image

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

Например, используя стандартный командлет Where-Object, можно выбрать из всех результатов те, которые отвечают определенным критериям. Данные переменные удобно использовать после того как функция отработала.

Более подробные сведения и примеры можно получить, выполнив после установки модуля команду Get-Help Get-Systeminfo -Examples

Файл конфигурации

Функция Get-Systeminfo имеет файл конфигурации, находящийся в папке config. Он представляет из себя powershell скрипт, содержащий основные настройки. Наличие данного файла позволят вносить изменения в функцию, не редактируя основной код модуля. Для того чтобы расширить либо убрать ненужный функционал — нужно всего лишь изменить этот файл.
Основные переменные в файле.

Добавляя или удаляя свойства из массива, можно настраивать какие сведения будут получены. $Defaultinfoconfig определяет, какая информация будет получена, когда функция будет запущена без каких-либо параметров.

Где ключом является свойство, которое будет указываться в параметре Properties, а значением строка в стиле параметров powershell. $Functionconfig содержит хэш таблицу. В строке допустимы следующие параметры: Class, Query, Property, Script, FormatList

Изменения в таблицу нужно вносить в том случае, если нужный для работы класс не принадлежит пространству имен root\cimv2. $ManualNamespace содержит хэш таблицу, где ключ-это класс, а значение- пространство имен, в котором находится класс.

$Switchconfig содержит хэш таблицу: ключом является имя switch параметра, а значением-массив свойств.

Как расширить возможности функции

Предположим, что нужно добавить возможность получать наименование ос. Для этого требуется выполнить 4 действия.

  1. Придумать название, которое будет однозначно характеризовать то, что мы хотим получить. В данном случае назовем OsCaption.
  2. Внести изменения в блок параметров функции, отредактировав файл Systeminfo.psm1. Изменить нужно [ValidateSet()] для параметра Properties, добавив название, придуманное на первом шаге.
  3. Изменить файл конфигурации. Так как наименование ос можно получить через wmi обьект класса Win32_OperatingSystem (свойство caption)

    Спойлер

    image

    нужно добавить в хэш таблицу $Functionconfig строку вида

    OsCaption='-Class Win32_OperatingSystem -Property Caption'

  4. Если powershell запущен, и модуль был загружен: необходимо перезапустить консоль, либо выполнить Remove-Module Systeminfo

Выполнив четыре простых действия, мы получили новый функционал.

Спойлер

image

Не всегда представляется возможным получить нужные сведения напрямую из объекта wmi. Иногда для получения информации требуется обработать объекты нескольких классов. Для этих случаев необходимо писать скрипт.

Ссылаться на них можно, используя параметр Script в хэш таблице $functionconfig. Все скрипты модуля хранятся в папке Scripts. То есть, если бы в предыдущем примере требовался скрипт и ему для работы были нужны объекты нескольких классов, то строка для хэш таблицы приняла бы следующий вид

OsCaption='-Class Win32_OperatingSystem,Win32_ComputerSystem -Script Scriptfolder\oscaptionscript.ps1’

После параметра Class нужно перечислить, объекты каких классов требуются для работы. В скрипте они будут доступны через переменные с аналогичным названием-в данном примере это $win32_operatingsystem и $win32_computersystem. Кроме этого во всех сценариях есть три служебных переменных-это $Computername, $Protocol и $Credential.

Для протокола Dcom нужно учитывать, что вся информация должна быть получена через wmi. Скрипт для модуля ничем не отличается от обычного, кроме того, что не требуется использовать Get-Wmiobject, так как wmi объекты уже доступны через соответствующую переменную. Связано это с местом выполнения скриптов. Не получится использовать командлеты get-process get-services и прочие подобные. В случае Dcom протокола все скрипты выполняются там, где запущена функция Get-Systeminfio.

Остальные нюансы использования файла конфигурации можно понять, изучив его подробно. Если для подключения используется протокол Wsman, скрипты выполняются на компьютере, с которого получаем информацию, поэтому нет никаких ограничений: можно использовать любые командлеты. Сейчас там находится множество примеров.

Я рекомендую использовать 5 версию, так как там появилась функция авто дополнения, которая значительно облегчает работу. Модуль тестировался на второй и пятой версии powershell, но скорее всего будет работать и на всех остальных.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть