Системным администраторам приходится выполнять множество рутинных задач по сопровождению и поддержке систем. При этом, конечно же хотелось бы максимально автоматизировать эти задачи. Сегодня мы поговорим о том, как с помощью сценариев PowerShell можно выполнять различные задачи администрирования в среде Windows.
Начнем с такой важной темы, как сбор информации о компьютерах. Здесь нам помогут командлеты из модуля CimCmdlets. Они являются наиболее важными командлетами для общих задач управления системой. Все критически важные параметры подсистемы доступны через WMI. Более того, WMI рассматривает данные как объекты, которые находятся в коллекциях из одного или нескольких элементов. Поскольку PowerShell также работает с объектами и имеет конвейер, позволяющий обрабатывать один или несколько объектов одинаковым образом, общий доступ к WMI позволяет выполнять некоторые сложные задачи с минимальными усилиями.
Для начала посмотрим настройки рабочего стола. Это можно сделать с помощью команды:
Get-CimInstance -ClassName Win32_Desktop
В результате получим информацию обо всех рабочих столах, независимо от того, используются они или нет.

Стоит отметить, что информация, возвращаемая некоторыми классами WMI, может быть очень подробной и часто включает метаданные о классе WMI. Поскольку большинство этих метаданных имеют имена, начинающиеся с Cim, вы можете фильтровать свойства с помощью Select-Object. Укажите параметр -ExcludeProperty со значением "Cim*". Например:
Get-CimInstance -ClassName Win32_Desktop | Select-Object -ExcludeProperty "CIM*"
Чтобы отфильтровать метаданные, используйте оператор конвейера (|) для отправки результатов команды Get-CimInstance в Select-Object -ExcludeProperty "CIM*".
Далее попробуем получить с помощью Powershell информацию о BIOS системы на локальном компьютере:
Get-CimInstance -ClassName Win32_BIOS
Для того, чтобы узнать какой процессор используется в системе можно воспользоваться классом WMI Win32_Processor, хотя, вероятно, вам потребуется отфильтровать информацию:
Get-CimInstance -ClassName Win32_Processor | Select-Object -ExcludeProperty "CIM*"
В целом, информация о модели компьютера доступна из Win32_ComputerSystem. Стандартный вывод команд не потребует фильтрации для предоставления данных OEM:
Get-CimInstance -ClassName Win32_ComputerSystem

Важно учитывать, что результаты выполнения подобных команд, возвращающих информацию непосредственно от оборудования, зависят от качества имеющихся у вас данных. Некоторая информация может быть некорректно настроена производителями оборудования и, следовательно, недоступна.
Обновления и информация о системе
Очень часто нам необходимо получить информацию об используемой на машине операционной системе, учетных записях и установленных обновлениях.
Для того, чтобы узнать, какая версия ОС у нас установлена, нам потребуется класс Win32_OperatingSystem. Он включает в себя информацию о версии и пакете обновлений. Вы можете явно выбрать только эти свойства, чтобы получить сводную информацию о версии из Win32_OperatingSystem:
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property BuildNumber,BuildType,OSType,ServicePackMajorVersion,ServicePackMinorVersion
Вы также можете использовать фильтрацию по параметрам Property. Поскольку все свойства, начинающиеся с Build или ServicePack, важны для использования здесь, мы можем сократить это до следующего вида:
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property Build*,OSType,ServicePack*

Для того, чтобы получить информацию о локальных пользователях в системе можно также воспользоваться свойствами класса Win32_OperatingSystem. Вы можете явно выбрать свойства для отображения следующим образом:
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property NumberOfLicensedUsers, NumberOfUsers, RegisteredUser
Более лаконичный вариант с использованием подстановочных знаков:
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property *user*
Если нам необходимо узнать дисковое пространство и свободное место на локальных дисках, вы можем использовать класс Win32_LogicalDisk. Вам нужно видеть только экземпляры с типом диска DriveType равным 3, значением, которое WMI использует для жестких дисков фиксированной конфигурации.
Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3"

Получить список всех установленных исправлений можно с помощью класса Win32_QuickFixEngineering. Этот класс возвращает список исправлений, который выглядит следующим образом:
Get-CimInstance -ClassName Win32_QuickFixEngineering

Если настолько подробный вывод не требуется, то можно использовать параметр Property команды Get-CimInstance для выбора только HotFixID.
Get-CimInstance -ClassName Win32_QuickFixEngineering -Property HotFixId | Select-Object -Property HotFixId

Управление службами
Помимо задач сбора информации о системе и обновлениях с пользовательских машин, нам также может потребоваться выполнять некоторые задачи администрирования, например управлять службами, запущенными на машине.
С помощью командлета Get-Service можно получить информацию о службах на локальном или удаленном компьютере. Использование команды Get-Service без параметров возвращает все службы. Вы можете фильтровать по имени, даже используя звездочку в качестве подстановочного знака:
PS> Get-Service -Name se*
Status Name DisplayName
------ ---- -----------
Running seclogon Secondary Logon
Running SENS System Event Notification
Stopped ServiceLayer ServiceLayer
Поскольку не всегда очевидно, какое реальное имя у службы, вам может потребоваться найти службы по отображаемому имени. Для этого можно выполнить поиск по конкретному имени, используя подстановочные знаки или указав список отображаемых имен:
PS> Get-Service -DisplayName se*
Status Name DisplayName
------ ---- -----------
Running lanmanserver Server
Running SamSs Security Accounts Manager
Running seclogon Secondary Logon
Stopped ServiceLayer ServiceLayer
Running wscsvc Security Center
PS> Get-Service -DisplayName ServiceLayer, Server
Status Name DisplayName
------ ---- -----------
Running lanmanserver Server
Stopped ServiceLayer ServiceLayer
Часто возникает необходимость в получении служб с удаленных машин. В Windows PowerShell для этого можно воспользоваться параметром ComputerName командлета Get-Service. Параметр ComputerName принимает несколько значений и подстановочные символы, поэтому вы можете получить список служб с нескольких компьютеров одной командой. Например, следующая команда получает список служб на удаленном компьютере Server01.
Get-Service -ComputerName Server01
Начиная с PowerShell 6.0, командлеты *-Service не имеют параметра ComputerName. Вы по-прежнему можете получать список служб на удаленных компьютерах с помощью удаленного доступа PowerShell. Например, следующая команда получает список служб на удаленном компьютере Server02.
Invoke-Command -ComputerName Server02 -ScriptBlock { Get-Service }
Командлет Get-Service имеет два параметра, которые очень полезны в администрировании служб. Так, параметр DependentServices получает список служб, которые зависят от данной службы. А параметр RequiredServices получает список служб, от которых зависит служба.
В качестве примера узнаем, от каких параметров зависит служба Lanman
PS> Get-Service -Name LanmanWorkstation -RequiredServices

А если мы наоборот хотим узнать, кто зависит от Lanman, то нужно выполнить следующее:
PS> Get-Service -Name LanmanWorkstation -DependentServices

Узнать все службы, имеющие зависимости можно с помощью следующего набора команд:
Get-Service -Name * | Where-Object {$_.RequiredServices -or $_.DependentServices} |
Format-Table -Property Status, Name, RequiredServices, DependentServices –Auto
Заключение
Powershell является достаточно мощным инструментом, позволяющим решить многие задачи автоматизации администрирования систем под управлением Windows. В этой статье мы рассмотрели несколько примеров использования команд Powershell для решения повседневных административных задач.

Если PowerShell-скрипты уже экономят вам часы, следующий шаг — понять, как устроена вся Windows-инфраструктура. На курсе «Администратор Windows» разбирают проектирование и эксплуатацию: Active Directory, безопасность и стабильность, интеграции и автоматизацию на PowerShell — чтобы не лечить симптомы, а управлять системой.
Чтобы узнать больше о формате обучения и познакомиться с преподавателями, приходите на бесплатные демо-уроки:
24 декабря. PowerShell kick start. Основы работы. Записаться
14 января. Инфраструктура виртуальных рабочих столов VDI. Записаться
21 января. Платформа виртуализации Hyper-V в Windows. Записаться
