Предварительные требования

Цель и результаты работы

Цель этой работы - научиться использованию ключевых возможностей Windows PowerShellдля выполнения различных административных задач.

Предварительные требования

Выполнение данной работы не зависит от выполнения предыдущих практических работ.

Задачи Описание действий
1. На компьютере ********* добавить компоненту Windows PowerShell, используя Server Manager. a. Авторизуйтесь на компьютере ********подучетной записью Administratorс паролем. b. Запустите Server Managerиз меню Start.Раскройте вкладку и в дереве консоли выберите объект Features. c. Выберите пункт Добавить компоненты/ Add Features d. В окне Select Featuresпоставьте флажок напротив компоненты Windows PowerShellи нажмите Next. e. В окне Confirm Installation Selectionsподтвердите установку, нажав "Установить/Install". f. Дождитесь окончания установки компоненты. g. После завершения установки отобразится итоговое окно. Новая компонента успешно установлена. Закройте окно Installation Results.
2. Запуск среды Windows PowerShell a. Запуск среды Windows PowerShellосуществляется следующим образом Пуск (Start) ->Все Программы (All Programms)и выбрать элемент Windows PowerShell.Другой вариант запуска оболочки - пункт Выполнить... (Run)в меню Пуск (Start),ввести имя файла powershellи нажать кнопку ОК. b. Выполним первую команду в PowerShell. Для первого знакомства с Windows PowerShell вполне подойдет команда help. Внимательно изучите выведенную на экран информацию. c. Исполните из командной строки: PS C:> Help Get-Command В результате выполнения этой команды мы получим полное описание команды Get-Command,включая ее назначение, синтаксис, опции и т.п. d. Выполните команду: PS C:> Get-Command На экран будет выведен список всех встроенных команд. e. Просмотрите список всех сервисов, запущенных на вашем компьютере, исполнив команду: PS C:> Get-Service Команда Get-Serviceслужит для получения списка всех сервисов, запущенных на данном компьютере. f. Просмотрите список всех процессов, запущенных в настоящий момент на вашем компьютере, исполнив команду: PS C:> Get-Process g. Для получения информации только об одном процессе в качестве аргумента команды Get-Processзадается имя этого процесса. Выполните команду: PS C:> Get-Process explorer h. Из командной строки исполните команду: PS C:> Get-Process w* На экран должна быть выведена информация обо всех запущенных процессах, начинающихся на символ w. По умолчанию информация выводится в виде таблицы, но на самом деле все команды возвращают объекты. Эти объекты могут быть переданы на вход другим командам с помощью символа «|» i. Исполните команду: PS C:> Get-Process i* | format-list Объекты будут отформатированы в виде списка. Теперь список процессов доступен в другом представлении. Для получения подробной информации о различных форматах можно использовать следующую команду: PS C:> Help format* Другие возможные форматы: PS C:> Get-Process i* | format-wide и PS C:> Get-Process i* | format-custom Выполняя команды, мы всегда получаем объекты, а у объектов есть свойства. Просмотрите все свойства объекта, полученного при выполнении команды Get-Process используя следующую команду: PS C:> Get-Process | Get-Member j. Поскольку на выходе всегда получается объект, можно манипулировать им для выполнения дополнительных операций. Выполните операцию фильтрации, исполнив команду: PS C:> Get-Process | where {$_.handlecount -gt 400} k. Выполните операцию сортировки, исполнив команду: PS C:> Get-Process | where {$_.handlecount -gt 400} | sort-object Handles l. Выполним команду Get-Process|Get-Member Company— при форматировании по умолчанию невозможно получить желаемые данные. Преобразуем полученную команду в: PS C:> Get-Process | Get-Member Company | Format-List PS C:> Get-Process | sort-object Company | format-table -Group Company name, description, handles. m. Произведем сортировку объектов по свойству WS (working set) и выбор 5 процессов, занимающих больше всего памяти PS C:> Get-Process | sort-object -property WS –descending| select-object -first 5 Команда stop-process позволяет остановить запущенный процесс. Запустите Notepadна виртуальной машине. Выполните команду: PS С:> Get-process notepad | stop-process Окно Блокнота закроется. Снова запустите Notepad. Такая возможность не всегда является безопасной, поэтому лучше использовать подобные команды с опцией whatif, которая показывает, что произойдет при выполнении той или иной команды, но на самом деле команда не выполняется: PS C:> Get-Process notepad | stop-process -whatif Кроме того, можно указывать на необходимость подтверждения перед выполнением команды: PS C:> Get-Process notepad | stop-process -confirm В последнем примере мы получаем описание действий, которые выполняет команда, и можем выбрать, подтверждать ее выполнение или нет. Помимо этого можно создавать собственные пакетные файлы, представляющие собой файлы с расширением *.psl, в которые помещаются команды PowerShell, и выполнять их. Для соблюдения безопасности пакетные файлы должны быть подписаны. Для защиты пользовательских данных и целостности операционной системы в оболочке Windows PowerShell реализованы некоторые средства обеспечения безопасности, в том числе политика выполнения. Политика выполнения определяет, можно ли выполнять сценарии, и если да, должны ли они быть подписаны цифровой подписью. Кроме того, она определяет, можно ли загружать конфигурационные файлы. Прежде всего, посмотрите текущий статус политики выполнения. Сделать это можно с помощью команды: PS C:> get-executionpolicy В случае установки по умолчанию вы должны получить статус Restricted. Для того чтобы сменить этот статус, воспользуйтесь командой: PS C:> set-executionpolicy <статус_политики> Рассмотрим, какие статусы политики выполнения возможны: Restricted - эта политика выполнения по умолчанию. Допускает отдельные команды, но сценарии выполнять нельзя. AllSigned - здесь выполнение сценариев разрешено, но необходимо наличие цифровой подписи надежного издателя на всех сценариях и файлах конфигураций, включая сценарии, написанные на локальном компьютере. Также при такой политике запрашивают подтверждение перед выполнением сценариев надежных издателей. Однако при этом существует опасность того, что подписанные, но вредоносные сценарии выполняются. RemoteSigned- при таком статусе политики выполнение сценариев также разрешено. Необходимо наличие цифровой подписи надежного издателя на всех сценариях и файлах конфигураций, загруженных из Интернета (включая электронную почту и программы мгновенного обмена сообщениями). Нет необходимости в цифровых подписях на сценариях, запускаемых с локального компьютера. Не запрашивают подтверждения перед выполнением сценариев надежных издателей. Подписанные, но вредоносные сценарии также выполняются. Unrestricted- самая демократичная политика, позволяет запускать неподписанные сценарии. Сценарии и файлы конфигурации, загруженные из Интернета (включая Microsoft Outlook, Outlook Express и Windows Messenger), выполняются после предупреждения, что данный файл был загружен из Интернета. Как и следовало ожидать, при таком статусе также возможно выполнение вредоносных сценариев. Думаю, использование данного статуса политики выполнения возможно только на тестовых машинах, так как в реальных сетях это крайне небезопасно. В зависимости от специфики выполняемых серверами задач рекомендуется использовать RemoteSigned, в случаях, когда выполняются преимущественно сценарии собственного написания, и AllSigned, когда выполняются сценарии, полученные из внешних источников. Для нашего упражнения устанавливаем статус политики Unrestrictedлибо RemoteSigned: PS C:> Set-ExecutionPolicy Unrestricted но после окончания тестирования не забудьте снова включить данную опцию с помощью следующей команды: PS C:> Set-ExecutionPolicy AllSigned Для запуска скриптов psl достаточно просто набрать в командной строке PowerShell имя файла.
3. Работа с файловой системой Одна из задач, с которой часто сталкиваются многие ИТ- специалисты, связана с манипуляциями с файлами, такими как копирование, перемещение, переименование, удаление файлов и каталогов. Разберем основные команды Windows PowerShell, применяемые для манипуляций с файловой системой: new-item, copy-item, move-item, rename-item и remove-item. a. Создадим новый подкаталог TextFilesв текущем каталоге: PS C:> new-item TextFiles -itemtype directoryЕсли опустить параметр -itemtype,то Windows PowerShellспросит, что мы создаем — файл (file)или каталог (directory).Отметим, что у команды new-itemесть алиас — ni. В сокращенном виде наша первая команда будет выглядеть так: PS C:> ni TextFiles -itemtype directory b. Создайте несколько новых файлов в текущем каталоге psdemo.txt, 1.txt, 2.txt: c. Скопируем все файлы с расширением *.txt в подкаталог TextFiles,используя команду copy-item(алиасы — cpi, cp, сору): Если применять данную команду в пакетном файле, имеет смысл сделать ее более понятной, указав параметры -path (источник)и -destination (приемник): PS C:>copy-item -path '.\*.txt' -destination '.\TextFiles' d. После выполнения команды копирования мы используем команду set-locationдля перехода в подкаталог TextFiles. PS C:> set-location TextFiles e. С помощью команды rename-itemпереименовываем файл psdemo.txtв psdemo.bak.При необходимости можно применять опции -pathи -newName: PS C:> rename-item psdemo.txt psdemo.bak f. После того как файл переименован, переносим его на один уровень вверх, используя команду move-item: PS C:> move-item psdemo.bak..\ g. Затем применяем команду set-location,а точнее — ее алиас slдля перехода в другой каталог: PS C:> sl .. 1. h. Манипуляции с файловой системой мы завершаем удалением всего каталога TextFiles, используя команду remove-item. Поскольку в каталоге TextFiles содержатся файлы, применяется опция -recurse. Если эта опция не указана, Windows PowerShell запросит подтверждение перед выполнением команды remove-item. PS C:> remove-item TextFiles -recurse
4. Работа с реестром При выполнении различных настроек и попытках обнаружения каких-либо параметров нам иногда приходится обращаться к системному реестру в поисках ключей, значений и т.п. С использованием возможностей Windows PowerShellэта задача может быть решена достаточно простым способом. Давайте рассмотрим пример работы с реестром из среды PowerShell,в котором найдем и скопируем все данные, содержащие строку «PowerShell»,а затем выведем первые два найденных объекта. a. Наша первая команда использует алиас slдля выполнения команды set-location,изменяющей наше текущее местоположение с файловой системы на ветвь HKEY_CURRENT_USERв системном реестре: PS C:\> sl hkcu: Отметим, что, как и в случае работы с файловой системой, PowerShellприменяет специальный провайдер для доступа к реестру. b. Следующая команда загружает содержимое всей ветви реестра HKEY_CURRENT_USER в переменную reg: PS HKCU:\> $reg = gci . -rec -ea silentlycontinue Для этого мы используем команду get-childitem(алиас — gci). Первый аргумент этой команды — «.» — указывает на то, что мы хотим получить содержимое текущей ветви реестра — HKEY_CURRENT_USER.Второй аргумент является сокращением от опции -recurseи указывает на то, что нам нужен рекурсивный сбор данных из всех подветвей текущей ветви реестра. И наконец, третий аргумент -easilentlycontinue— указывает на то, что команда должна продолжать выполняться даже в случае возникновения ошибок, связанных с недостатком прав доступа к определенным подветвям реестра. c. Выполните следующую команду: PS HKCU:\>$s = $reg | % {if ((gp $_.pspath) -match 'PowerShell' ){$_.pspath}} которая копирует из реестра данные, содержащие строку 'PowerShell'. Мы начинаем с того, что берем объект reg и перенаправляем его в команду %, которая является алиасом команды for-each. Она выполняет рекурсивный обход всех элементов реестра, находящихся в объекте reg и на каждом шаге сохраняет элемент в специальном объекте PowerShell с именем '_'. В фигурных скобках мы указываем действия, которые должны выполняться на каждом шаге выполнения команды for-each. Внутри блока for-each мы используем проверку if для того, чтобы узнать, соответствуют ли текущая запись реестра и ее свойство pspath, которые мы получаем через обращение к команде get-itemproperty (через алиас gp), нашему критерию — наличию строки 'PowerShell'. Если соответствие найдено, мы возвращаем значение свойства pspath. Все найденные соответствия сохраняются в объекте s. d. Работу с реестром мы завершаем перенаправлением результатов поиска в команду select-object (через алиас select) и показываем два первых найденных результата: PS HKCU:\>$s | select -first 2 e. В качестве упражнения перенаправьте финальные результаты в файл с помощью команды out-file.
5. Доступ к системному журналу Для обнаружения причин сбоев мы часто обращаемся к системному журналу, в котором хранится множество полезной информации о событиях, происходивших в системе. Обычно для исследования системного журнала применяется утилита Event Viewer (eventvwr.exe).В PowerShell мы можем воспользоваться встроенными командами, например командой get-eventlog, для быстрого исследования содержимого системного журнала. Для примера выведем 5 информативных сообщений в журнале System. a. Но для начала, давайте убедимся, что такой журнал существует, введя команду: PS C:\> get-eventlog -list Эта команда загружает ключевую информацию из системного журнала. Без использования опции -list PowerShell запросит точное указание названия системного журнала. В нашем примере мы видим несколько точек входа в системном журнале: Application, InternetExplorer, System, Windows Power Shell и т.п. b. Извлечем записи из системного журнала, которые имеют тип "Error": PS C:\> $bad = get-eventlog "System" | where-object { $_.EntryType -eq "Error" } Мы используем команду get-eventlog, которой указываем параметр "System" для извлечения только системных записей, — мы могли бы более четко задать это, применив параметр logName. Содержимое переменной $bad передается на вход команде where-object для фильтрации только интересующих нас записей. В качестве аргументов команды where-object мы указываем на то, что ищем только записи, у которых свойство Entry Type равно "Error". с. Выведем на экран пять последних записей об ошибках, используя для этого команду select-object с параметром - last: PS C:\> $bad | select-object -last 5
6. Доступ к процессам Еще одна задача, с которой могут столкнуться ИТ-специалисты, связана с обнаружением аномалий в работе системы, например, процессов, которые потребляют большие объемы памяти. Давайте посмотрим, как эта задача решается средствами WindowsPowerShell. a. Сохраняем информацию о всех процессах, запущенных на данном компьютере, в переменной $allprocs: PS C:\> $allprocs= get-process b. После этого мы перенаправляем полученную информацию команде for-each, которая тоже может быть указана алиасом % или foreach: PS C:\> $allprocs | foreach-object {if ($_.Virtualmemorysize -gt 20MB) {$_.name}} Данная команда перебирает все объекты, связанные с процессом, и на каждом шаге сохраняет информацию во внутреннем объекте $_. Этот объект можно условно назвать текущим объектом. В качестве параметров для команды for-eachмы указываем операцию сравнения значения свойства virtualmemorysizeс интересующим нас размером памяти (20 Мбайт в нашем примере). Если значение этого свойства для текущего объекта больше заданного, мы выводим название процесса на экран. Отметим, что в PowerShellподдерживаются основные сокращения для указания размеров — KB, MB, GB, что очень полезно, поскольку не нужно считать нули при указании объемов памяти, дисков и т.п.
7. Доступ к WMI Как мы знаем, Windows Management Instrumentation (WMI)— это реализация компанией Microsoft стандарта Common Information Model (CMI). В большинстве случаев WMI применяется ИТ-специалистами для получения информации об аппаратном и программном обеспечении, установленном на данном компьютере. Как мы увидим в следующем примере, использование Windows PowerShell существенно облегчает доступ к информации, хранимой в WMI. a.Применим команду get-wmiobject для получения информации о файле, используемом для свопинга памяти на диск и сохранения этой информации в переменной $pfu: PS C:\> $pfu = get-wmiobject -class 'win32_pageFileUsage' b.Далее мы применим команду get-member для определения свойств, доступных для классаWin32_pageFileUsage: PS C:\> $pfu | get-member -membertype property | where-object { $_.name -notmatch'_'} Обычно для нахождения информации по определенному классу можно использовать команду get-memberбез указания параметров, но в нашем примере нас интересуют только доступные свойства и только те из них, которые не содержат в имени символ подчеркивания. Чтобы узнать о существовании класса WMI win32_pageFileUsage(ведь известно, что в WMI поддерживается более тысячи классов, помимо этого ряд приложений добавляет свои классы), вы можете применить команду: PS C:\> get-wmiobject -list для получения списка всех существующих в системе классов. После того как мы определили доступные нам свойства класса, мы выводим содержимое интересующих нас свойств на экран: PS C:\> Spfu.caption; $pfu.currentusage с. Класс win32_DiskDrive,в котором хранится информация о дисках, установленных в системе. Этот класс — пример WMI-класса, содержащего более одного объекта. Определяем значение свойства captionпервого диска, установленного в системе: Задание. Напишите необходимые команды самостоятельно. Другая задача - проверить, сколько свободного места есть на дисках, на которые возможна запись: PS C:\> get-wmiobject win32_LogicalDisk Нам нужны диски, на которые можно писать. У них type=3: PS C:\> get-wmiobject win32_LogicalDisk -filter "drivetype=3" Затем нужно получить параметры deviceid, freespace: PS C:\> get-wmiobject win32_LogicaIDisk -filter "drivetype=3" |select deviceid, freespace Данные выводятся в байтах, что неудобно, поэтому переводим их в гигабайты: PS C:\> get-wmiobject win32_LogicaIDisk -filter "drivetype=3" |%{$_.deviceid;$_.freespace/lGB}

Заключение

Мы рассмотрели основные возможности Windows PowerShell для упрощения задач, возникающих перед ИТ-специалистами.

Как мы знаем, эти задачи часто решаются с помощью скриптового языка VBScript. В Windows PowerShell есть возможность применения существующего кода на VBScript, aследовательно, миграция значительно упрощена.

Наши рекомендации