company_banner

Что такое Windows PowerShell и с чем его едят? Часть 6: Решение практических задач



    В предыдущих статьях мы разобрались с основами среды и достаточно подробно изучили язык программирования Microsoft PowerShell. Завершая цикл, мы рассмотрим работу с процессами и службами, реестром и журналами событий в распределенной среде, а также разберем некоторые способы администрирования операционной системы, настройки стороннего ПО и просмотра сведений об установленном оборудовании. Для этого в PowerShell активно применяются объекты различных типов, изучению которых были посвящены четвертая и пятая части цикла.

    Оглавление:


    Удаленное управление
    Командлеты vs CIM/WMI
    Управление процессами через CIM/WMI
    Управление службами через CIM/WMI
    Работа с реестром
    Работа с журналами событий
    Информация об ОС и оборудовании

    Удаленное управление


    PowerShell позволяет удаленно управлять одним или несколькими компьютерами. Для этого можно задействовать объекты .NET, CIM, WMI, поддерживающие соответствующую функцию командлеты, удаленный запуск команд или интерактивную удаленную сессию. Подключение осуществляется через PS remoting/WinRM по протоколу HTTP (порт 5985) или HTTPS (порт 5986, требуется сертификат SSL). По умолчанию соединение устанавливается по HTTP, но данные все равно шифруются с использованием симметричного ключа AES-256. Поддерживаются два способа аутентификации: NTLM и Kerberos (по умолчанию). Второй способ доступен, если удаленный компьютер входит в домен AD, а в Workgroup или если вместо доменного имени указан IP, применяется NTLM и требуется дополнительная настройка. На компьютере, к которому мы подключаемся, должен быть запущен сервис WinRM.



    Если сервис не запущен, можно воспользоваться командлетом Enable-PSRemoting. Виртуальные машины RuVDS с Windows Server Core конфигурируются с настроенным из коробки удаленным доступом и никаких дополнительных действий не требуют. Для использования HTTP также придется добавить хост, к которому необходимо подключиться, в TrustedHost компьютера, с которого запускается команда. Если машина работает в глобальной сети, может потребоваться настройка брендмауэра. PS remoting/WinRM позволяет создавать удаленные сессии (New-PSSession, Get-PSSession, Enter-PSSession), выполнять команды и скрипты (Invoke-Command) на одном или нескольких компьютерах, а также использовать командлеты с параметром -ComputerName. Последнее справедливо и в отношении командлетов для работы с CIM/WMI. Более подробная информация доступна на сайте Microsoft.

    Командлеты vs CIM/WMI


    Хотя некоторые командлеты поддерживают параметр -ComputerName, возможности их применения для работы с хостами в сети ограничены. Создания сессий и удаленного выполнения команд PowerShell хватает не всегда, и тут нам помогут командлеты для работы с WMI или CIM (иногда можно обойтись и NET-объектами). Использование CIM предпочтительнее, поскольку дальнейшая разработка и поддержка WMI в Windows прекращена. В обоих случаях используется Common Information Model (CIM) и экземпляры соответствующих классов. При необходимости можно просматривать структуру результирующих объектов, фильтровать, сортировать и выделять их из коллекции, а также проводить другие действия над полученными результатами. При работе в интерактивном режиме текстовый вывод несложно отформатировать, а в скриптах обычно обращаются к свойствам и методам объектов. Хотя командлеты WMI и CIM похожи, в первом случае нетрудно получить ссылку на конкретный объект (экземпляр класса) и непосредственно вызвать один из его методов без использования Invoke-WmiMethod. Результирующие CIM-объекты методов класса не содержат, поэтому вызывать командлет Invoke-CimMethod для управления придется обязательно.

    Управление процессами через CIM/WMI


    В предыдущих статьях мы довольно часто использовали Get-Process, который возвращает соответствующие запущенным в системе процессам объекты типа System.Diagnostics.Process. С помощью этого командлета можно получать сведения только о локальном компьютере, а чтобы работать с удаленной машиной, нам снова понадобятся командлеты CIM/WMI и класс Win32_Process. Приведем примеры используемых для работы с ним команд.

    Get-WmiObject Win32_Process

    или

    Get-CimInstance Win32_Process



    Предыдущие примеры иллюстрируют получение информации о запущенных на локальной машине процессах, для работы с удаленными компьютерами используется параметр -ComputerName:

    Get-WmiObject Win32_Process -ComputerName IP_ADDRESS
    Get-WmiObject Win32_Process -ComputerName NAME

    или

    Get-CimInstance Win32_Process -ComputerName IP_ADDRESS
    Get-CimInstance Win32_Process -ComputerName NAME

    Управление службами через CIM/WMI


    Командлет Get-Service в актуальных реализациях поддерживает параметр -ComputerName, но позволяет только получить информацию о статусе сервиса на удаленной машине — управлять им через свойства и методы результирующих объектов не получится. Более правильным в распределенной среде подходом также считается использование командлетов CIM и WMI. Как и для процессов, для служб в объектной модели CIM имеется специальный класс Win32_Service.

    Get-WmiObject Win32_Service

    или

    Get-CimInstance Win32_service



    Чтобы работать с удаленным компьютером, необходимо воспользоваться параметром -ComputerName:

    Get-WmiObject Win32_Service -ComputerName IP_ADDRESS
    Get-WmiObject Win32_Service -ComputerName NAME

    или

    Get-CimInstance Win32_service -ComputerName IP_ADDRESS
    Get-CimInstance Win32_service -ComputerName NAME

    Для уточняющих запросов используется параметр -Filter. Таким способом несложно выяснить, стартует служба автоматически или должна быть запущена вручную:

    Get-Wmiobject Win32_service -Filter "StartMode <>'disabled'" | sort StartMode | format-table -GroupBy StartMode -Property Name,State,PathName -AutoSize

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

    Get-Wmiobject Win32_service | group startname

    Следующая команда возвращает все сервисы, запущенные от имени администратора:

    Get-Wmiobject Win32_service -Filter "startname like '%administrator%'" | Select Name,startmode,state,startname,systemname

    Для командлетов CIM фильтры работают аналогично:

    Get-CimInstance Win32_service -filter "startmode='auto' AND state<>'Running'" | Select Name,State,Systemname

    Для реальной работы важен не столько текстовый вывод командлетов, сколько сами бинарные объекты. С их помощью можно запускать и останавливать соответствующие службы, менять режим их запуска или устанавливать свойства. В случае с WMI методы объектов вызываются напрямую или через Invoke-WmiMethod. Для объектов CIM доступно только использование Invoke-CimMethod.

    Работа с реестром


    Системный реестр Windows — это имеющая древовидную структуру иерархическая база данных, содержащая информацию об аппаратной и программной конфигурации компьютера. Каждый ее узел — это содержащий другие узлы (записи базы данных) раздел либо имеющий некое значение ключ. Раздел может содержать вложенные подразделы: по структуре реестр напоминает файловую систему и для работы с ним в PowerShell есть виртуальные «диски». Просмотреть их можно с помощью командлета Get-PSDrive, а обратиться к соответствующему разделу — с помощью Set-Location (псевдоним cd).



    «Диски» реестра содержат «каталоги» (разделы), подкаталоги «подразделы» и «файлы» (параметры). Для просмотра подразделов используется командлет Get-ChildItem (псевдоним dir), а для просмотра параметров: Get-ItemProperty. Разделы реестра представлены экземплярами .NET-класса Microsoft.Win32.RegistryKey, а параметры — System.Management.Automation.PSCustomObject. Чтобы получить доступ к системному реестру удаленной машины, придется напрямую использовать объекты .NET, WMI или CIM.

    Работа с журналами событий


    Журналы событий (Event logs) в Windows — важный для администратора инструмент, с помощью которого можно отслеживать состояние системы и приложений, а также оперативно анализировать возникающие проблемы. Обычно для работы нужны журнал безопасности (Security log), системный журнал (System log) и журнал приложений (Application log). В зависимости от установленных компонентов и настроенных ролей, на сервере могут быть и другие: журнал службы каталога (Directory service log), журнал службы каталога (Directory service log) или, например, журнал службы репликации файлов (File Replication Service log). Для их просмотра на локальной машине используется консоль управления MMC, а в PowerShell командлет Get-EventLog. Для работы с удаленными хостами можно воспользоваться соответствующими определенным журналам объектами CIM и WMI (экземплярами класса Win32_NTEventlogFile).

    $Logs = Get-WmiObject Win32_NTEventlogFile 
    $Logs | Format-List

    или

    $Logs = Get-CimInstance Win32_NTEventlogFile 
    $Logs | Format-List



    Пример иллюстрирует работу с локальными журналами, для подключения к удаленному компьютеру нужен параметр -ComputerName:

    $Logs = Get-WmiObject Win32_NTEventlogFile -ComputerName NAME
    $Logs | Format-List

    или

    $Logs = Get-CimInstance Win32_NTEventlogFile -ComputerName NAME
    $Logs | Format-List

    Информация об ОС и оборудовании


    С помощью командлетов CIM и WMI можно получать разнообразную информацию от работающих в сети компьютеров, а также управлять ими. Для этих целей применяются командлеты CIM/WMI и соответствующие классы. Рассмотрим их использование на практических примерах.

    Класс Win32_OperatingSystem решает множество разнообразных задач. С помощью его метода Win32Shutdown завершается сеанс пользователя:

    (Get-WMIObject Win32_OperatingSystem).Reboot()

    Для получения информации о BIOS потребуется класс Win32_BIOS

    Get-WmiObject Win32_BIOS | Select-Object -Property * -ExcludeProperty __*

    или

    Get-CimInstance Win32_BIOS | Select-Object -Property * -ExcludeProperty __*



    Вывод свойств операционной системы:

    Get-WmiObject Win32_OperatingSystem | Select-Object –Property * -ExcludeProperty __*

    или

    Get-CimInstance Win32_OperatingSystem | Select-Object –Property * -ExcludeProperty __*



    Класс Win32_QuickFixEngineering предназначен для получения списка установленных обновлений:

    Get-WmiObject Win32_QuickFixEngineering

    или

    Get-CimInstance Win32_QuickFixEngineering


    Завершая цикл публикаций, мы хотим напомнить, что PowerShell — нечто большее, чем просто командная оболочка. Скорее она напоминает гибрид Bash и SSH/SSHD с возможностью использования объектов .NET и объектной модели CIM. Это позволяет решать сложные задачи управления распределенной ИТ-средой, хотя и требует иногда громоздких синтаксических конструкций. Без знания PowerShell сегодня не обойдется ни один грамотный системный администратор Windows.



    Часть 1: Основные возможности Windows PowerShell
    Часть 2: Введение в язык программирования Windows PowerShell
    Часть 3: Передача параметров в скрипты и функции, создание командлетов
    Часть 4: Работа с объектами, собственные классы
    Часть 5: Доступ к внешним объектам



    RUVDS.com
    RUVDS – хостинг VDS/VPS серверов

    Комментарии 4

      +1
      Мне решительно непонятно, кто плюсует этот затянувшийся реферат. Где реальные примеры решения прикладных нетривиальных задача? Где описание тонких моментов работы с powershellом? Ну хотя бы работы с текстом в юникоде и проблем с BOM в версиях ниже 6-й? Где примеры работы с .net для задач, для которых нет готовых командлетов: работа с БД, примеры работы в качестве web-сервера, в качестве демона-службы и т.п.
        0
        а может кто нибудь объяснить, почему если вызвать Get-MsmqQueue локально, то можно получить всю информацию, обо всех очередях, а если на удалённом сервере, через Invoke-Command или с помощью Enter-PSSession то видно только приватные очереди?
          +1
          Как в powershell проверить валидность всех цифровых подписей системных файлов?
          Как получить список самых больших файлов в директории?
          Как создать контрольные суммы для файлов в папке и потом их проверить?
            0
            Windows Powershell — уже легаси технология, финальная версия 5.1 была выпущена примерно три года назад и все на этом. Сейчас уже все перешли на Powershell (Core), который кросс-платформенный

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое