В работе любого ИТ-специалиста бывают случаи, когда необходимо получить информацию о системе.
Иногда требуется собрать один или несколько параметров системы со многих рабочих станций и быстро их обработать.
Чем быстрее будет получена информация, тем, конечно, лучше.
В этой статье я хотел бы представить модуль powershell, с помощью которого можно быстро получить практически любую информацию о системе.
Например: мне удалось собрать информацию о размере оперативной памяти с нескольких сотен рабочих станций всего за двадцать с небольшим секунд! В Интернете можно найти большое количество powershell-скриптов, получающих ту или иную информацию о системе.
Как правило, это небольшие скрипты или функции, использующие wmi. На одной рабочей станции они прекрасно выполняют свою задачу, но если компьютеров много, то возникают проблемы.
Главный недостаток – сбор информации происходит синхронно; сценарий не перейдет на следующий компьютер, пока не отработает на текущем.
В результате, чтобы получить информацию от всего парка ПК, в лучшем случае можно ждать очень долго, а в худшем — сценарий может зависнуть и так и не завершиться.
Мне хотелось сделать какой-то универсальный инструмент. лишен вышеперечисленных недостатков.
Для удобства использования был написан модуль powershell, который на данный момент содержит одну функцию Get-Systeminfo. Сегодня функция позволяет получить много различной информации о системе.
По сути, он содержит большую коллекцию скриптов и может быть легко расширен за счет добавления новых скриптов.
Информация для скачивания и установки Если у вас PowerShell версии 5 или выше, вы можете установить модуль, выполнив команду
Для других версий ссылка на ГитхабInstall-Module -Name Systeminfo -Scope CurrentUser
Ключевые функциональные особенности
- Многопоточность
- Вы можете использовать протоколы DCOM и WSMAN для подключения к удаленному компьютеру.
- Работа с конвейером (например, в домене можно запросить список компьютеров с помощью командлета Get-Adcomputer с параметром -filter*, передав через конвейер результат его выполнения Get-Systeminfo, мы будем получать информацию от всех компьютеры в домене)
- Легкая масштабируемость
Вместо этого я постараюсь доходчиво объяснить, как им пользоваться и как можно расширить функционал.
Как использовать функцию Get-SystemInfo
Работая с командлетом Get-Adcomputer, я заметил параметр Properties. Это позволило расширить стандартный вывод команды свойствами, перечисленными после него.Именно эта концепция была взята за основу.
Например, чтобы запросить информацию о модели процессора и оперативной памяти, после параметра Properties нам необходимо через запятую перечислить свойства, которые мы хотим увидеть в результате выполнения.
Пример работы
Параметры переключателя используются для группировки свойств.
Вы можете использовать несколько параметров переключателя и параметр Properties вместе.
Пример работы
Во время работы функции создаются две глобальные переменные $Result и $ErrorResult. В первом находятся компьютеры, с которых можно было получить информацию.
Во второй содержатся компьютеры, на которых произошли ошибки.
Эти переменные удобно использовать после завершения функции.
Например, с помощью стандартного командлета Where-Object можно выбрать из всех результатов те, которые соответствуют определенным критериям.
Более подробную информацию и примеры можно получить, выполнив команду Get-Help Get-Systeminfo -Examples после установки модуля.
Конфигурационный файл
Функция Get-Systeminfo имеет файл конфигурации, расположенный в папке config. Это скрипт PowerShell, содержащий основные настройки.Наличие этого файла позволит вам вносить изменения в функцию без редактирования основного кода модуля.
Для того, чтобы расширить или удалить ненужный функционал, вам достаточно изменить этот файл.
Основные переменные в файле.
$Defaultinfoconfig определяет, какая информация будет получена при запуске функции без каких-либо параметров.
Добавляя или удаляя свойства из массива, вы можете настроить, какая информация будет извлекаться.
$Functionconfig содержит хеш-таблицу.
Где ключ — это свойство, которое будет указано в параметре Properties, а значение — это строка в стиле параметров PowerShell. В строке разрешены следующие параметры: Class, Query, Property, Script, FormatList. $ManualNamespace содержит хеш-таблицу, где ключом является класс, а значением — пространство имен, в котором находится класс.
Изменения в таблицу необходимо вносить, если необходимый для работы класс не принадлежит пространству имен root\cimv2. $Switchconfig содержит хеш-таблицу: ключ — это имя параметра переключателя, а значение — массив свойств.
Как расширить возможности функции
Предположим, вам нужно добавить возможность получения названия операционной системы.Для этого потребуется 4 шага.
- Придумайте название, которое будет однозначно характеризовать то, что мы хотим получить.
В данном случае назовем его OsCaption.
- Внесите изменения в блок функциональных параметров, отредактировав файл Systeminfo.psm1. Вам необходимо изменить [ValidateSet()] для параметра «Свойства», добавив имя, которое вы придумали на первом шаге.
- Измените файл конфигурации.
Так как имя ОС можно получить через объект wmi класса Win32_OperatingSystem (свойство caption) Спойлер
вам нужно добавить такую строку в хеш-таблицу $FunctionconfigOsCaption='-Class Win32_OperatingSystem -Property Caption'
- Если powershell запущен и модуль загружен: необходимо перезапустить консоль или запустить Remove-Module Systeminfo.
Спойлер
Не всегда возможно получить нужную информацию непосредственно из wmi-объекта.
Иногда для получения информации необходимо обработать объекты нескольких классов.
Для этих случаев необходимо написать скрипт.
Все скрипты модуля хранятся в папке Scripts. На них можно ссылаться с помощью параметра Script в хеш-таблице $functionconfig. То есть, если в предыдущем примере требовался скрипт и для его работы требовались объекты нескольких классов, то строка для хеш-таблицы приняла бы следующий вид OsCaption='-Class Win32_OperatingSystem,Win32_ComputerSystem -Script Scriptfolder\oscaptionscript.ps1’
После параметра Class нужно указать, какие объекты класса необходимы для работы.
В скрипте они будут доступны через одноимённые переменные — в данном примере это $win32_operatingsystem и $win32_computersystem. Кроме того, во всех скриптах есть три служебные переменные: $Computername, $Protocol и $Credential. Скрипт для модуля ничем не отличается от обычного, за исключением того, что вам не нужно использовать Get-Wmiobject, поскольку объекты wmi уже доступны через соответствующую переменную.
Для протокола Dcom необходимо учитывать, что всю информацию необходимо получать через wmi. Вы не сможете использовать командлеты get-process get-services и тому подобное.
Это связано с тем, где выполняются сценарии.
В случае протокола Dcom все скрипты выполняются там, где запускается функция Get-Systeminfio. Если для подключения используется протокол Wsman, скрипты выполняются на том компьютере, с которого мы получаем информацию, поэтому ограничений нет: можно использовать любые командлеты.
Остальные нюансы использования конфигурационного файла можно понять, изучив его детально.
Сейчас есть много примеров.
Модуль тестировался на второй и пятой версиях powershell, но скорее всего он будет работать и на всех остальных.
Я рекомендую использовать версию 5, так как в ней есть функция автозаполнения, которая значительно упрощает вашу работу.
Теги: #Системное администрирование #Администрирование сервера #инвентаризация #PowerShell #информация о системе
-
Простой Сервотестер С Индикатором
19 Oct, 24 -
Powershell: Машина Против Человека
19 Oct, 24 -
Свобода Панорамы
19 Oct, 24 -
Дешевый Водород?
19 Oct, 24 -
Плюсы И Минусы Xamarin
19 Oct, 24