Знакомство с возможностями Windows PowerShell
Итак, вы — администратор, которому необходимо в кратчайший срок освоить Windows PowerShell. Первое, что вы, вероятно, предпримете (естественно, помимо обращения к документации и справочной системе), — воспользуетесь командой Help (рис. 1).Рис. 1
Внимательно изучив выведенную на экран информацию, мы придем к пониманию следующих концептуальных вещей: в Windows PowerShell существуют алиасы, командлеты, провайдеры, а также справочные файлы. Алиасы (alias) служат для упрощения ввода команд (например, clc — это алиас команды Clear-Content), командлеты (cmdlet) представляют собой реализацию всех встроенных в Windows PowerShell команд, провайдеры (provider) обеспечивают доступ к файловой системе, реестру, хранилищу сертификатов и т.п., а справочные файлы (helpfile) используются для получения дополнительной информации. Для получения подробного описания команды применяется следующий синтаксис:PS C:> Help Get-Command
В результате выполнения этой команды мы получим полное описание команды Get-Command, включая ее назначение, синтаксис, опции и т.п. (рис. 2).
Рис. 2
Для получения списка всех встроенных команд используем следующий синтаксис:PS C:> Get-Command
Обратите внимание на то, что все команды состоят из глагола и прилагательного (например, Get-Content, Export-Console) и все команды поддерживают единую систему именования — например для завершения чего-либо всегда используется глагол Stop, а не Kill, Terminate, Halt или другие синонимы, что существенно упрощает изучение возможностей PowerShell (рис. 3).
Рис. 3
Команда Get-Service служит для получения списка всех сервисов, запущенных на данном компьютере. Например,PS C:> Get-Service
возвращает список, представленный на рис. 4.
Рис. 4
Для получения списка процессов, запущенных в настоящий момент на компьютере, применяется команда Get-Process (рис. 5):Рис. 5
PS C:> Get-Process
В Windows PowerShell поддерживается автоматическое завершение ввода. Чтобы убедиться в этом, введите Get-P и нажмите клавишу TAB: вы получите возможность выбора всех команд, начинающихся с введенных символов.
Для получения информации только об одном процессе в качестве аргумента команды Get-Process задается имя этого процесса (рис. 6):
Рис. 6
PS C:> Get-Process explorer
Для того чтобы получить список всех процессов, названия которых начинаются с определенного символа, достаточно указать этот символ и «*» (рис. 7):
Рис. 7
PS C:> Get-Process i*
Обратите внимание на колонки, в которых содержится информация, — Handles, NMP(K) и т.п. По умолчанию информация выводится в виде таблицы, но на самом деле все команды возвращают объекты. Эти объекты могут быть переданы на вход другим командам с помощью символа «|» (рис. 8):
Рис. 8
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
Поскольку на выходе всегда получается объект, можно манипулировать им для выполнения дополнительных операций, например фильтрации:
PS C:> Get-Process | where {$_.handlecount -gt 400}
или сортировки:
PS C:> Get-Process | where {$_.handlecount -gt 400} | sort-object Handles
Может возникнуть вполне резонный вопрос: а откуда мы узнали, что у объекта, описывающего процесс, есть свойство handlecount? Для получения списка всех свойств объекта применяется следующая команда (рис. 9):
Рис. 9
PS C:> Get-Process | Get-Member
Выполним команду Get-Process | Get-Member Company — при форматировании по умолчанию невозможно получить желаемые данные. Преобразуем полученную команду в:
PS C:> Get-Process | Get-Member Company | Format-List
Результат ее преобразования представлен на рис. 10.
Рис. 10
PS C:> Get-Process | sort-object Company | format-table -Group Company name, description, handles
Результат выполнения данной команды представлен на рис. 11.
Рис. 11
Команда stop-process позволяет остановить запущенный процесс, например:PS C:> Get-process notepad | stop-process
Такая возможность не всегда является безопасной, поэтому лучше использовать подобные команды с опцией whatif, которая показывает, что произойдет при выполнении той или иной команды, но на самом деле команда не выполняется:
PS C:> Get-Process notepad | stop-process –whatif
Кроме того, можно указывать на необходимость подтверждения перед выполнением команды:
PS C:> Get-Process notepad | stop-process –confirm
Результат выполнения команды с подтверждением представлен на рис. 12.
Рис. 12
В последнем примере мы получаем описание действий, которые выполняет команда, и можем выбрать, подтверждать ее выполнение или нет.Помимо этого можно создавать собственные пакетные файлы, представляющие собой файлы с расширением *.ps1, в которые помещаются команды PowerShell, и выполнять их. Для соблюдения безопасности пакетные файлы должны быть подписаны. При тестировании можно отключить требование по запуску только подписанных файлов:
PS C:> Set-ExecutionPolicy Unrestricted
но после окончания тестирования не забудьте снова включить данную опцию с помощью следующей команды:
PS C:> Set-ExecutionPolicy AllSigned
После знакомства с основами Windows PowerShell посмотрим, как с помощью данной утилиты можно решать различные административные задачи.
Работа с файловой системой
Одна из задач, с которой часто сталкиваются многие ИT-специалисты, связана с манипуляциями с файлами, такими как копирование, перемещение, переименование, удаление файлов и каталогов. На рис. 13 показаны основные команды Windows PowerShell, применяемые для манипуляций с файловой системой: new-item, copy-item, move-item, rename-item и remove-item.Рис. 13
В отличие от других оболочек, в которых существует и набор команд для файлов (например, delete или rename), и набор для каталогов (например, rd или md), в Windows PowerShell единый набор команд используется для манипуляций как с файлами, так и с каталогами.Первая команда в нашем примере — new-item TextFiles –itemtype directory — применяется для создания нового подкаталога TextFiles в текущем каталоге. Если опустить параметр –itemtype, то Windows PowerShell спросит, что мы создаем — файл (file) или каталог (directory). Отметим, что у команды new-item есть алиас — ni. В сокращенном виде наша первая команда будет выглядеть так:
PS C:> ni TextFiles –itemtype directory
Затем мы используем команду copy-item (алиасы — cpi, cp, copy) для копирования всех файлов с расширением *.txt в подкаталог TextFiles. Если применять данную команду в пакетном файле, имеет смысл сделать ее более понятной, указав параметры –path (источник) и –destination (приемник):
PS C:>copy-item –path ‘.\*.txt’ –destination ‘.\TextFiles’
После выполнения команды копирования мы используем команду set-location для перехода в подкаталог TextFiles. С помощью команды rename-item переименовываем файл psdemo.txt в psdemo.bak. При необходимости можно применять опции –path и –newName. После того как файл переименован, переносим его на один уровень вверх, используя команду move-item. Затем применяем команду set-location, а точнее — ее алиас sl для перехода в другой каталог. Манипуляции с файловой системой мы завершаем удалением всего каталога TextFiles, используя команду remove-item. Поскольку в каталоге TextFiles содержатся файлы, применяется опция –recurse. Если эта опция не указана, Windows PowerShell запросит подтверждение перед выполнением команды remove-item.
Работа с реестром
При выполнении различных настроек и попытках обнаружения каких-либо параметров нам иногда приходится обращаться к системному реестру в поисках ключей, значений и т.п. С использованием возможностей Windows PowerShell эта задача может быть решена достаточно простым способом. Возможности Windows PowerShell показаны на рис. 14.Рис. 14
Наша первая команда использует алиас sl для выполнения команды set-location, изменяющей наше текущее местоположение с файловой системы на ветвь HKEY_CURRENT_USER в системном реестре:PS C:\> sl hkcu:
Отметим, что, как и в случае работы с файловой системой, PowerShell применяет специальный провайдер для доступа к реестру.
Аналогами приведенной выше команды являются команды:
PS C:\> sl registry:hkcu
и
PS C:\> sl hkey_current_user
Следующая команда загружает содержимое всей ветви реестра HKEY_CURRENT_USER в переменную reg:
PS HKCU:\> $reg = gci . –rec –ea silentlycontinue
Для этого мы используем команду get-childitem (алиас — gci), принцип работы которой аналогичен работе с файловой системой. Первый аргумент этой команды — «.» — указывает на то, что мы хотим получить содержимое текущей ветви реестра — HKEY_CURRENT_USER. Второй аргумент является сокращением от опции –recurse и указывает на то, что нам нужен рекурсивный сбор данных из всех подветвей текущей ветви реестра. И наконец, третий аргумент — –ea silentlycontinue — указывает на то, что команда должна продолжать выполняться даже в случае возникновения ошибок, связанных с недостатком прав доступа к определенным подветвям реестра.
Следующая команда в нашем примере:
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.
Работу с реестром мы завершаем перенаправлением результатов поиска в команду select-object (через алиас select) и показываем два первых найденных результата. В качестве упражнения вы можете перенаправить финальные результаты в файл с помощью команды out-file.
Доступ к процессам
Еще одна задача, с которой могут столкнуться ИТ-специалисты, связана с обнаружением аномалий в работе системы, например процессов, которые потребляют большие объемы памяти. Давайте посмотрим, как эта задача решается средствами Windows PowerShell (рис. 15).Рис. 15
В первой команде мы сохраняем информацию о всех процессах, запущенных на данном компьютере, в переменной $allprocs:PS C:\> $allprocs = get-process
После этого мы перенаправляем полученную информацию команде for-each, которая тоже может быть указана алиасом % или foreach. Данная команда перебирает все объекты, связанные с процессом, и на каждом шаге сохраняет информацию во внутреннем объекте $_. Этот объект можно условно назвать текущим объектом. В качестве параметров для команды for-each мы указываем операцию сравнения значения свойства virtualmemorysize с интересующим нас размером памяти (20 Мбайт в нашем примере). Если значение этого свойства для текущего объекта больше заданного, мы выводим название процесса на экран. Отметим, что в PowerShell поддерживаются основные сокращения для указания размеров — KB, MB, GB, что очень полезно, поскольку не нужно считать нули при указании объемов памяти, дисков и т.п.
Доступ к системному журналу
При попытке обнаружения причин сбоев мы часто обращаемся к системному журналу, в котором хранится множество полезной информации о событиях, происходивших в системе. Обычно для исследования системного журнала применяется утилита Event Viewer (eventvwr.exe). В PowerShell мы можем воспользоваться встроенными командами, например командой get-eventlog, для быстрого исследования содержимого системного журнала (рис. 16).Рис. 16
Наша первая команда загружает ключевую информацию из системного журнала:PS C:\> get-eventlog –list
Без использования опции –list PowerShell запросит точное указание названия системного журнала. В нашем примере мы видим несколько точек входа в системном журнале: Application, Internet Explorer, System, Windows Power Shell и т.п. Наша следующая команда извлекает записи из системного журнала, которые имеют тип “Error”:
PS C:\> $bad = get-eventlog “System” | where-object { $_.EntryType –eq “Error” }
Мы используем команду get-eventlog, которой указываем параметр “System” для извлечения только системных записей, — мы могли бы более четко задать это, применив параметр logName. Содержимое переменной $bad передается на вход команде where-object для фильтрации только интересующих нас записей. В качестве аргументов команды where-object мы указываем на то, что ищем только записи, у которых свойство EntryType равно “Error”.
Мы завершаем исследование системного журнала выводом на экран пяти последних записей об ошибках, используя для этого команду select-object с параметром –last:
PS C:\> $bad | select-object –last 5
Заключение
Рис. 20
В приведенном выше примере показано, как можно использовать существующий код на VBScript в PowerShell. В первой строке мы создаем новый COM-объект, который представляет собой ядро выполнения скриптовых программ — ScriptControl. Затем мы указываем, что будем использовать язык Visual Basic Script. В третьей строке задается собственно код на VBScript — в нашем примере это вызов функции MsgBox, но на практике в переменную можно, например, загрузить код файла. И наконец, в последней строке мы добавляем код на VBScript в наш объект — и код поступает на выполнение.
Комментариев нет:
Отправить комментарий