Командлеты из модуля CimCmdlets — самые важные для общих задач управления системой. Cmdlets from CimCmdlets module are the most important cmdlets for general system management tasks. Все ключевые параметры подсистемы доступны через инструментарий WMI. All critical subsystem settings are exposed through WMI. Более того, инструментарий WMI обрабатывает данные как объекты, сгруппированные в коллекции из одного или нескольких элементов. Furthermore, WMI treats data as objects that are in collections of one or more items. Поскольку Windows PowerShell также работает с объектами и имеет конвейер, позволяющий одинаково обрабатывать отдельный объект или несколько объектов, общий доступ к инструментарию WMI предоставляет возможность выполнять некоторые сложные задачи с небольшими затратами усилий. Because Windows PowerShell also works with objects and has a pipeline that allows you to treat single or multiple objects in the same way, generic WMI access allows you to perform some advanced tasks with very little work.

Вывод параметров рабочего стола Listing Desktop Settings

Для начала рассмотрим команду, собирающую сведения о рабочих столах локального компьютера. We’ll begin with a command that collects information about the desktops on the local computer.

Эта команда возвращает сведения обо всех рабочих столах, вне зависимости от их использования. This returns information for all desktops, whether they are in use or not.

Сведения, возвращаемые некоторыми классами WMI, могут быть очень подробными и часто содержат метаданные о классе WMI. Information returned by some WMI classes can be very detailed, and often include metadata about the WMI class.

Так как имена большинства этих свойств метаданных начинаются с Cim, эти свойства можно отфильтровать с помощью Select-Object . Because most of these metadata properties have names that begin with Cim, you can filter the properties using Select-Object . Укажите параметр -ExcludeProperty, используя "Cim*" как значение. Specify the -ExcludeProperty parameter with "Cim*" as the value. Пример: For example:

Чтобы отфильтровать метаданные, используйте оператор конвейера (|) для отправки результатов команды Get-CimInstance в Select-Object -ExcludeProperty "CIM*" . To filter out the metadata, use a pipeline operator (|) to send the results of the Get-CimInstance command to Select-Object -ExcludeProperty "CIM*" .

Вывод сведений о BIOS Listing BIOS Information

Класс WMI Win32_BIOS возвращает довольно компактные и полные сведения о системной BIOS локального компьютера: The WMI Win32_BIOS class returns fairly compact and complete information about the system BIOS on the local computer:

Вывод сведений о процессоре Listing Processor Information

Общие сведения о процессоре можно получить с помощью класса Win32_Processor инструментария WMI, но вам, скорее всего, потребуется отфильтровать полученные данные: You can retrieve general processor information by using WMI’s Win32_Processor class, although you will likely want to filter the information:

Чтобы получить общую строку описания семейства процессора, достаточно вернуть свойство SystemType: For a generic description string of the processor family, you can just return the SystemType property:

Вывод производителя и модели компьютера Listing Computer Manufacturer and Model

Сведения о модели компьютера также доступны в Win32_ComputerSystem. Computer model information is also available from Win32_ComputerSystem. Чтобы получить данные поставщика вычислительной техники (OEM), стандартные отображаемые выходные данные фильтровать не нужно: The standard displayed output will not need any filtering to provide OEM data:

Выходные данные из команд, подобных показанной выше и возвращающих сведения напрямую от аппаратного обеспечения, не могут быть дополнены. Your output from commands such as this, which return information directly from some hardware, is only as good as the data you have. Иногда сведения неверно сконфигурированы производителем оборудования и недоступны для запроса. Some information is not correctly configured by hardware manufacturers and may therefore be unavailable.

Вывод установленных исправлений Listing Installed Hotfixes

Список всех установленных исправлений можно получить с помощью Win32_QuickFixEngineering: You can list all installed hotfixes by using Win32_QuickFixEngineering:

Этот класс возвращает список исправлений в следующем виде: This class returns a list of hotfixes that looks like this:

Для получения более кратких сведений нужно исключить некоторые свойства. For more succinct output, you may want to exclude some properties. Параметр Property в Get-CimInstance позволяет выбрать только идентификаторы HotFixID, однако на самом деле возвращается больше данных, так как по умолчанию отображаются все метаданные: Although you can use the Get-CimInstance ‘s Property parameter to choose only the HotFixID, doing so will actually return more information, because all the metadata is displayed by default:

Дополнительные данные выводятся, так как параметр Property в Get-CimInstance ограничивает свойства, возвращаемые из экземпляров класса WMI, но не объекты, возвращаемые оболочке PowerShell. The additional data is returned, because the Property parameter in Get-CimInstance restricts the properties returned from WMI class instances, not the object returned to PowerShell. Командлет Select-Object позволяет сократить возвращаемые выходные данные: To reduce the output, use Select-Object :

Вывод сведений о версии операционной среды Listing Operating System Version Information

Свойства класса Win32_OperatingSystem включают сведения о версии операционной системы и пакета обновления. The Win32_OperatingSystem class properties include version and service pack information. Эти свойства можно выбрать явным образом, чтобы получить сводные данные по версиям из Win32_OperatingSystem: You can explicitly select only these properties to get a version information summary from Win32_OperatingSystem:

С параметром Property в Select-Object можно использовать подстановочные символы. You can also use wildcards with the Select-Object ‘s Property parameter. Поскольку в рассматриваемом случае важны все свойства, имена которых начинаются с Build либо с ServicePack, указанную строку можно сократить: Because all the properties beginning with either Build or ServicePack are important to use here, we can shorten this to the following form:

Вывод локальных пользователей и владельца Listing Local Users and Owner

Общие сведения о локальных пользователях — количество лицензированных пользователей, текущее число пользователей и имя владельца — можно получить, выбрав свойства класса Win32_OperatingSystem. Local general user information — number of licensed users, current number of users, and owner name — can be found with a selection of Win32_OperatingSystem class properties. Отображаемые свойства можно указать явным образом: You can explicitly select the properties to display like this:

В более сжатом варианте используются подстановочные символы: A more succinct version using wildcards is:

Получение сведений о доступном месте на диске Getting Available Disk Space

Чтобы получить сведения о дисковом пространстве и свободном месте на локальных дисках, можно воспользоваться классом Win32_LogicalDisk инструментария WMI. To see the disk space and free space for local drives, you can use the Win32_LogicalDisk WMI class. Для просмотра следует выбрать только те экземпляры, у которых свойство DriveType принимает значение 3, так как именно оно используется инструментарием WMI для постоянных жестких дисков. You need to see only instances with a DriveType of 3 — the value WMI uses for fixed hard disks.

Получение сведений о сеансах входа в систему Getting Logon Session Information

Общие сведения о сеансах входа в систему, связанных с пользователями, можно получить через класс Win32_LogonSession инструментария WMI: You can get general information about logon sessions associated with users through the Win32_LogonSession WMI class:

Получение сведений о пользователе, выполнившем вход на компьютер Getting the User Logged on to a Computer

Имя пользователя, выполнившего вход на определенный компьютер, можно отобразить с помощью Win32_ComputerSystem. You can display the user logged on to a particular computer system using Win32_ComputerSystem. Приведенная ниже команда возвращает только пользователей, выполнивших вход на рабочий стол системы: This command returns only the user logged on to the system desktop:

Получение сведений о местном времени компьютера Getting Local Time from a Computer

Сведения о текущем местном времени определенного компьютера можно получить с помощью класса Win32_LocalTime инструментария WMI. You can retrieve the current local time on a specific computer by using the Win32_LocalTime WMI class.

Отображение состояния службы Displaying Service Status

Для просмотра состояния всех служб на определенном компьютере можно локально воспользоваться командлетом Get-Service . To view the status of all services on a specific computer, you can locally use the Get-Service cmdlet. Для удаленных систем можно использовать класс Win32_Service инструментария WMI. For remote systems, you can use the Win32_Service WMI class. Если использовать Select-Object для фильтрования Status, Name и DisplayName, формат вывода будет идентичен формату вывода командлета Get-Service : If you also use Select-Object to filter the results to Status, Name, and DisplayName, the output format will be almost identical to that from Get-Service :

Чтобы полностью отобразить службы с очень длинными именами, может потребоваться использовать командлет Format-Table с параметрами AutoSize и Wrap, позволяющими оптимизировать ширину столбцов и переносить длинные имена на следующие строки вместо их усечения: To allow the complete display of names for the occasional services with extremely long names, you may want to use Format-Table with the AutoSize and Wrap parameters, to optimize column width and allow long names to wrap instead of being truncated:

Примечание: данный пост перепечатан в связи с закрытием бложиков на spaces.live.com, как имеющий какую-то ценность для автора и/или читателей.

Ричард Сиддэвей (Richard Siddaway) в своём блоге ведёт на мой взгляд интересный цикл постов Windows 2000 Scripting Guide (W2KSG) с применением PowerShell и WMI. В них рассказываются достаточно интересные и полезные возможности классов WMI для сбора различных сведений как программной части системы, так и аппаратной. Так же недавно на форуме TechNet была поднята (да, на форумах всегда найдутся археологи, которые выкопают темы полу- и годичной давности, а то и ещё старше 🙂 ) тема про скрипт, который бы собрал данные об аппаратной составляющей компьютеров. Подобные темы периодически всплывают на различных форумах. Я подумал, что неплохо было бы решить данный вопрос с помощью PowerShell.

Итак, отправной точкой для меня послужила ссылка на Computer System Hardware Classes, где я посмотрел какие классы можно применить. Изучив весь список я отобрал лишь самые необходимые для решения задачи классы, а именно:

Достаточно сходить по ссылкам и можно посмотреть множество свойств каждого класса, которые детально описывают себя. Но при прочтении очень важно следить за поддерживаемыми свойствами в ОС, которые были выпущены до Windows Vista/2008. Я старался эти моменты учитывать, чтобы получить оптимальную совместимость как с предыдущими ОС, так и с текущими.

Ничего сверхсложного в этом нету, сперва я определил требуемые классы WMI в переменные и определил набор необходимых свойств каждого класса следующим образом:

После определения всех классов WMI и переменных я начал писать секцию вывода. Например, вывод имени компьютера и ОС, под которой он управляется:

Здесь можно не обращать на знаки регулярных выражений, т.к. они несут только одну функцию, а именно — удобное для воспроиятия форматирование вывода. Т.е. первой строкой пойдёт название поля Computer Name, после чего будет переход на новую строку (`n). Чтобы все строчки не сливались я значения полей отделил табулятором (`t). И в конце так же добавил знак возврата каретки (`n), чтобы отделить между собой поля. Вывод в данном случае будет таким:

Т.е. поля идут с левого края и между собой отделены двумя пустыми строками. А значения полей отделены табулятором относительно того же левого края. Мне кажется, что такой выход весьма читабелен и данные не сливаются в кучу. Когда у поля только одно значение — всё просто. Но когда значений возможно несколько, то задача форматирования выхода таких данных стала для меня небольшой проблемой. Почему небольшой — потому что ответ посмотрел в блоге у Ричарда, а именно в посте W2KSG: Free Disk Space. Суть заключается в очень простом: берётся переменная с массивом данных и по конвейеру при помощи команды Format-Table подготавливается табличный выход и с указанием основного элемента, по которому будет этот выход формироваться. Чтобы лучше понять этот процесс я покажу его на примере вывода сведений о процессоре. Сейчас многопроцессорные системы не редкость и скрипт должен поддерживать показ сведений о более чем одном процессоре:

К сожалению, ноутбук у меня однопроцессорный, поэтому эту часть скрипта я запустил на стационаре (в котором, кстати, тоже только 1 физический процессор. Но технология Hyper-Threading эмулирует именно настоящую мультипроцессорность, а не логические ядра, как это сделано в многоядерных процессорах). Итак, давайте разберём строку:

Переменная $CPU содержит сведения о всех установленных процессорах в системе. Я эту переменную передал по конвейеру сразу на команду форматирования — ft (сокращённый алиас от Format-Table) и указал по какому свойству форматировать (DeviceID, который перечисляет ID номера всех процессоров начиная с 0). А дальше я использовал несколько хэш-таблиц для отображения дополнительных свойств каждого объекта. Параметр Label задаёт название новой графе, а Expression указывается значение параметра (как Architecture и Model). Если посмотреть справку по классу Win32_Processor, то можно увидеть, что свойство Architecture содержит лишь числовое значение (от 0 до 9) и в справке приведена расшифровка этих значений. Числовые значения в данном случае, согласитесь, не самый читабельный вариант. Поэтому в Expression я вместил конструкцию Switch, которая автоматически будет числовым значениям сопоставлять понятные текстовые значения. И если свойство Architecture вернёт числовое значение 0, то Switch в нашем случае сопоставит ему более понятное значение x86. И в последней строке я добавил ещё одну хэш-таблицу, которая добавляет ещё одну графу — Model, которая будет содержать свойство Name класса Win32_Processor — название процессора.

Такое форматирование выхода я делал для каждого поля, которое может содержать несколько значений. Например, объём каждого установленного модуля памяти:

DeviceID будет содержать номер каждого установленного модуля памяти начиная с нулевого ряда (разбор понятий Ряд и Банк памяти выходит за рамки данного поста) или первого слота. StartingAddress и EndingAddress показывают адресное пространство, за которое отвечает каждый модуль начиная от первого байта. И простым вычитанием начального адреса из конечного мы получим ёмкость каждого модуля:

Так же, как и с процессорами я содержимое переменной $RAM перенаправил по конвейеру на форматирование по столбцу DeviceID. И через запятую добавил ещё одну хэш-таблицу, которая будет показывать объём каждого модуля. Если просто произвести операцию вычитания, то мы получим объём памяти в килобайтах. Чтобы показать объём в мегабайтах я просто разделил полученную разность на килобайты — 1KB (Очень удобная штука 🙂 ). Здесь важно было не ошибиться, т.к. по логике может показаться, что нужно делать на 1MB, чтобы получить размер в мегабайтах. Но, как я уже сказал выше, у нас разность будет уже в килобайтах. Поэтому, чтобы получить в мегабайты, то нам нужно разделить только на 1KB. И посмотрим, что мы будем иметь на выходе:

Вот так мы получили номера модулей памяти и объём каждого из них. После деления у нас не получится целое число, поэтому я сконвертировал это число в строку (ToString) и указал количество знаков после запятой — 0 знаков (F00). В данном случае дробное число просто округляется до ближайшего целого числа. Количество знаков после запятой можно изменить, например указав F01, которое округлит число до ближайшего целого числа с точностью до 1 знака после запятой. Это всё не я придумал, а честно взял из поста W2KSG: Free Disk Space 🙂

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

  1. Оформил скрипт в функцию Get-HwInfo и с возможностью передачи в неё имён компьютеров
  2. Каждый WMI класс позволяет собирать сведения не только с локальных комьютеров, но и с удалённых. Имя далённого компьютера указывается через параметр -ComputerName при вызове команды Get-WMIObject, например: $CPU = gwmi Win32_Processor -ComputerName $computers | Select Architecture, DeviceID, Name

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

Здесь видно, что в конце я снова применил конструкцию Switch, которая расшифровывает числовое значение статуса сетевого адаптера в его текстовое значение.

Согласен, что скрипт выглядит не очень опрятно, но в PowerGUI он выглядит вполне сносно. На основе данного скрипта каждый может его с лёгкостью расширить и изменить под свои нужды, я лишь старался показать образец решения задачи, а так же показал некоторые интересные приёмы в PowerShell. Кстати говоря, данный скрипт можно отправить в HTML формат командой ConvertTo-Html. Это будет удобно, когда потребуется собрать подобные сведения с нескольких компьютеров. Тогда HTML формат будет весьма полезен для последующего анализа. На сегодня всё, а теперь спать.

Вся информация по синтаксису языка открыта и доступна на ресурсах Майкрософт. Если вы считаете, что я где-то что-то скопировал или у кого-то украл — ваши проблемы =)

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

Выводом команды должно стать следующее:

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

Вывод будет следующим:

Соответственно, -Property можно указать любое другое значение [a], [c], [h-d] и так далее.

При помощи PowerShell можно получить информацию о BIOS:

Изменив класс, можно получить информацию о процессоре:

Можно дополнить скрипт уже знакомыми строчками и получить более подробный вывод:

Для общего описания семейства можно написать следующую строку:

Модель компьютера так же доступна из класса Win32:

Список установленных HotFix:

Информация об ОС:

Локальные пользователи и владельцы:

Короткая версия с помощью подстановки знаков:

Получаем информацию о дисковом пространстве:

Информация о вошедших пользователях:

Просмотр системного времени:

Что-бы просмотреть список локальных служб можно использовать cmdlet Get-Service. Для удалённых систем вы можете использовать WMI Win32_Service. Так же можно использовать Select-Object для фильтрации вывода: