Знакомство с PowerShell
Запустив PowerShell, вы не обнаружите поначалу никаких различий между ним и cmd.exe (разве что цвет фона окна у PowerShell по умолчанию — синий). Более того, вскоре вы обнаружите, что операции копирования/вставки в PowerShell реализованы также безобразно, как и в cmd.exe. Но первое впечатление о схожести этих оболочек, скажем так, не совсем соответствует действительности.
То обстоятельство, что работа оболочки PowerShell основана на .NET Framework, является главным ее отличием от предыдущих командных оболочек Windows. PowerShell полностью объектно-ориентирована. Результатом выполнения команды в PowerShell является не некий «текст сам по себе», а объект платформы .NET. Этот объект представляет собой собственно данные и имеет набор присущих ему свойств и методов.
Внутренние команды (точнее, командные структуры) для работы с объектами в PowerShell называются командлетами. Для них придумано специальное единообразное именование в виде комбинации действие-цель. Например, для получения данных используется действие “set”, для получения – “get”, для вывода — “out” и т. д. Цель – это тип объекта, к которому будет применено действие. Командлеты можно рассматривать как мини-программы, исполняемые в среде PowerShell. Для повышения функциональности можно создавать собственные командлеты или устанавливать командлеты сторонних разработчиков. Кроме командлетов, PowerShell позволяет выполнять функции, внешние сценарии (хранятся в файлах с расширением ps1) и внешние исполняемые файлы.
В состав PowerShell включена довольно обширная справочная система. Для начала работы с ней можно выполнить команду Get-Help.
Для получения детальной справки по какому-либо командлету или разделу основных сведений, необходимо указать его название в качестве параметра команды.
Как запустить Windows PowerShell
После объяснения, что такое Windows PowerShell, давайте посмотрим, как его запустить.
- Нажимаем на клавиатуре компьютера клавиши Win (это клавиша с логотипом Windows) и R одновременно. Откроется командное окно «Выполнить».
- В поле Открыть: введите powershell и нажмите кнопку ОК.
Более современный способ – доступный в Windows 10 – щелкнуть правой кнопкой мыши по меню «Пуск» и выбрать соответствующий пункт из меню «Опытного пользователя»
Параметры
Строго говоря, следуя духу единообразного именования в PowerShell, все передаваемые командлету имена параметров должны следовать за символом «-». Однако для простоты написания названия некоторых параметров можно опускать. Например, для вызова справки по командлету Get-Content вместо полного указания
Get-Help –name Get-Content
можно ввести команду
Get-Help Get-Content
Параметр может иметь какое-либо значение (в только что приведенном примере значением параметра name являлось Get-Content) или не иметь его. В этом случае он является аналогом переключателя какой-либо функциональности команды. Например, если необходимо получить полную информацию о командлете Get-Content, введите
Get-Help Get-Content –Detailed
Работа со службами и процессами
PowerShell, конечно же, умеет управлять службами и процессами в Windows, для этого существуют такие командлеты как:
- Get-Process – выводит информацию о запущенных процессах на компьютере;
- Start-Process – запускает один или несколько процессов на компьютере;
- Stop-Process — останавливает один или несколько запущенных процессов;
- Get-Service – выводит информацию о службах;
- Restart-Service – перезапускает службу;
- Start-Service – запускает службу;
- Stop-Service — останавливает службу;
- Suspend-Service – приостанавливает работу службы;
- Set-Service – с помощью данного командлета можно изменить свойства службы, например, описание, отображаемое имя и режим запуска. Также его можно использовать для запуска, остановки или приостановки службы.
Конвейер
В PowerShell реализован механизм передачи данных от одного процесса другому или вывод их в файл. Поскольку, как отмечалось выше, PowerShell оперирует не текстом, а объектами, при перенаправлении элементом обмена информации является объект, вместе со своей структурой. Такая возможность позволяет оперировать с объектами — отбирать их по заданному фильтру, сортировать, группировать их и т. д. Для организации такого конвейера (в документации на английском языке используется термин pipeline — трубопровод или канал) в тексте сценария используется знак вертикальной черты. При обнаружении такого знака интерпретатор передает объекты от одного командлета другому в качестве входных параметров.
В качестве примера конвейера и возможности получать доступ к свойствам передаваемых по нему объектов, приведем следующую ситуацию. Для проверки, не выполняются ли на компьютере некие подозрительные программы, мы хотим получить список всех запущенных процессов, получить пути и названия файлов, их запускающих, а также посмотреть дату создания таких файлов. В дополнение, отсортируем такой список по дате создания в убывающем порядке и отберем 10 наиболее «свежих» из них. Добавим к выводной информации также время последней модификации файла. Процессы с именами «System» и «Idle» из рассмотрения исключим, так как они не содержат пути к файлам.
Как говорится, хорошо сформулированный вопрос — уже половина решения. Взгляните:
Get-Process | where-Object {«System», «Idle» -notContains $_.Name} | Get-Item | Sort CreationTime -desc | Select Directory, Name, CreationTime, LastWriteTime -first 10
Вводя код, вы всегда можете разбить строку, поставив в месте переноса знак «`» после пробела. Можно даже просто нажать клавишу Enter, не закончив строки. В этом случае PowerShell изменит приглашение на >>, давая пользователю понять, что интерпретатор считает код не завершенным и ожидает окончания его ввода. Как и множество других скриптовых языков, PowerShell позволяет использовать переменные. Обозначением переменной служит знак «$». В случае передачи объекта по конвейеру, переменная $_ указывает на сам передаваемый объект.
Рассмотрим действия кода «по шагам». Сначала мы получаем список процессов с помощью командлета Get-Process. Эти данные передаются по конвейеру далее и фильтруются по условиям, заданным в where-Object (мы откидываем процессы с именами «System» и «Idle»).
Следующий элемент конвейера — Get-Item возвращает атрибуты отобранных объектов. Осталось их отсортировать (время создания в убывающем порядке) и выбрать интересующие нас значения (имена папки и исполняемого файла, время создания и последней модификации файла). Последний параметр, -first 10 указывает, что выводиться будут лишь первые 10 элементов из списка объектов. Попробуем выполнить:
Замечательно, то что надо. Однако при попытке выполнить тот же код в среде Windows XP или Server 2003 обнаружилось, что там это выглядит не столь гладко:
При просмотре результатов выполнения
Get-Process | Select Path
выяснилось, что пути двух процессов — winlogon и csrss — в Windows XP и Server 2003 PowerShell интерпретирует как \??\C:\WINDOWS\system32\. За разъяснением такого поведения я обратился к Василию Гусеву, специалисту по PowerShell. Он пояснил, что эти процессы не используют Win32API, и столь разная реакция на них в XP/Vista со стороны .NET, вероятно, вызвана различием платформ этих операционных систем.
Решив, что использовать механизмы обработки ошибок (в части обхода «непонятного» пути с подавлением вывода сообщения об ошибке) или исключения из списка процессов winlogon и csrss в данном случае не годится (возможно, они инфицированы, а дату их модификации в результатах мы уже не увидим), команды были изменены следующим образом:
Get-Process | ForEach-Object { if ($_.Path -ne $NULL ) { Get-Item ($_.Path -replace «\\\?\?\\», «») } } | Sort CreationTime -desc | Select FullName, Name, CreationTime, LastWriteTime -first 10
А читатель может получить некоторое представление об использовании в PowerShell условий и регулярных выражений. Небольшие пояснения к коду. На втором этапе конвейера применен командлет ForEach-Object, позволяющий выполнить заданную операцию для каждого объекта из набора, передаваемого на его вход. Как указывалось выше, текущий объект, над которым выполняется операция, представлен переменной $_. В качестве заданной операции здесь выступает условие вида if (условие){исполняемый код, если условие истинно}. Так же, как и в cmd.exe, для операторов сравнения используются не символы вида < или >, а аббревиатуры — в данном случае это «не равно»(not equal): -ne. Итак, если путь процесса содержит какое-либо значение (в случае с «System» и «Idle» путь просто отсутствует), с помощью функции replace все символы «\??\» в пути будут удалены (пожалуй, более детально затрагивать вопрос регулярных выражений мы пока не будем), а командлет Get-Item предоставит доступ к свойствам текущего процесса. Ну а далее — все, как и в первом примере. Результат выполнения теперь одинаков:
PowerShell: часто задаваемые вопросы
ВАСИЛИЙ ГУСЕВ
PowerShell: часто задаваемые вопросы
Windows PowerShell всё настойчивее входит в жизнь системных администраторов. Если раньше можно было игнорировать «новую забаву Microsoft с пафосным названием», то сейчас это всё сложнее и сложнее.
Поддержка PowerShell стала обязательной (в разумных пределах) для будущих серверных продуктов Microsoft, да и другие компании не удержались от того, чтобы использовать это средство автоматизации в своих продуктах. Например, VMware готовит VI Toolkit – оснастку для автоматизации и управления VMware ESX и VMware VirtualCenter, а Intel выпустила набор командлетов для управления WebSphere MQ. И это лишь самые громкие имена. Давно стало понятно, что PowerShell останется надолго. И надо сказать – это здорово!
Являясь неимоверно мощным инструментом автоматизации, PowerShell еще и очень удобен и прост в изучении. Множество стандартных псевдонимов и умение прозрачно работать с классическими утилитами командной строки облегчат переход любителям cmd.exe и других оболочек. Но тем не менее это совершенно другой язык и совсем другой подход к работе, поэтому у специалистов, начинающих осваивать PowerShell, неминуемо возникают вопросы. Я собрал вопросы, которые люди мне задавали, которые я встречал на просторах Интернета, ну и еще немножко добавил сам, из своего опыта работы. И в этой статье постараюсь дать на них ответы.
Что такое PowerShell?
Традиционная формулировка звучит так: «язык сценариев и оболочка командной строки нового поколения». Ранее был известен под кодовым именем «Monad».
Зачем он мне нужен, когда есть VB Script?
Платформа Windows долгое время была отстающей в области командной строки и скриптов. Унаследованный от DOS command.com, превратившийся затем в cmd.exe, Visual Basic Script да изредка JavaScript и Perl. Вот и всё, что было у администраторов. Но решив завоевывать направление серверных операционных систем, специалисты Microsoft поняли, что без командной строки – успеха не видать. Сначала появилось огромное количество утилит, таких как netsh, diskpart, fsutil. Но практически все они обладают собственным синтаксисом, выводят информацию в различном виде, да и для работы с ними всё равно нужна полноценная оболочка. Да и ресурсы Com-объектов тоже хочется использовать с помощью чего-либо более удобного, чем VB Script. И для этого был создан PowerShell. Создавался он с нуля, без оглядок на совместимость (как cmd) и именно для системных администраторов (в отличии от VBS). PowerShell вобрал в себя лучшие элементы из множества языков, например Perl, C# или PHP, но при этом принес в мир командной строки такие вещи, как объектные конвейеры или возможность использования .Net Framework. А учитывая еще огромный интерес производителей программного обеспечения к PowerShell, становится понятно: учить PowerShell – нужно.
Стоит ли начинать изучать PowerShell сейчас? Может лучше подождать, когда выйдет версия 2.0?
Смысла ждать второй версии нет никакого. Она не изменит языка, лишь добавит ему новые возможности. Совместимость с первой версией является главным приоритетом разработчиков. Да и доступная на момент написания статьи версия – лишь CTP (Community Technology Preview), то есть даже до Beta-версии PowerShell 2.0 не дорос.
А всё-таки, что будет нового в PowerShell 2.0?
Некоторые нововведения из тех, на которые уже сейчас можно посмотреть в CTP:
- Удаленное выполнение команд (PowerShell Remoting) – использование технологии WinRM для выполнения команд PowerShell на одном или множестве удаленных компьютеров, параллельно или последовательно. Ну и конечно, возможность отслеживать их состояние и получать результаты выполнения.
- Отладчик в консоли – к командлету Set-PSDebug добавятся новые: Enable-PSBreakPoint, Disable-PSBreakPoint, Get-PSBreakPoint, Invoke-PSBreakPoint, New-PSBreak Point, Remove-PSBreakPoint, позволяющие работать с отладочными «точками останова» в скриптах. Да так хорошо, что могут позавидовать многие продвинутые языки программирования. И всё это из командной строки.
- Улучшения работы с WMI – новые командлеты Invoke-WmiMethod, Remove-WmiObject, Set-WmiInstance, ну и некоторые улучшения в работе Get-WmiObject.
- Фоновые работы (Background Jobs) – xотя их можно использовать уже в 1.0, официальная версия не помешает. Это возможность выполнять команды или целые скрипты в фоне, параллельно основной работе.
- Графический Host – вариант графической оболочки от авторов языка.
- Улучшения в командлете Select-String – новый командлет Out-Grid, позволяющий выводить данные в окне с таблицей. Операторы -Join, -Split для облегчения работы с текстовыми строками.
- ScriptCmdlet – возможность создания командлетов только с помощью кода PowerShell, без применения C# или Visual Basic .Net
И многое другое…
На каких операционных системах можно использовать PowerShell?
Windows XP SP 2, Windows Server 2003, Windows Vista, Windows Server 2008. Хотя и заявлено, что PowerShell не поддерживается на Home-версиях Windows, он на них прекрасно работает. А вот владельцам Windows 2000 – не повезло, PowerShell на этой системе (и на всех предыдущих) работать не будет.
Бесплатен ли PowerShell? Как его можно получить?
PowerShell бесплатен. Скачать его можно на страничке https://www.microsoft.com/powershell/download. Хочу обратить внимание, что PowerShell (вместе со всей встроенной и прилагающейся документацией) доступен на русском языке. Получить его можно, скачав Localized Package.
На этой страничке нет версии для Windows 2008. Что делать?
PowerShell входит в стандартную поставку Windows 2008, то есть скачивать его не нужно. Установить его можно с помощью Server Manager, выбрав «Add Features».
А можно ли использовать PowerShell в режиме установки Windows 2008 Server Core?
К сожалению, пока нет. Это связано с отсутствием на Server Core .Net Framework необходимого PowerShell для работы. Появится он там не раньше следующего релиза. Будет ли это Windows 2008 Release 2 или вообще следующая версия – неизвестно.
В каких продуктах используется или будет использоваться PowerShell?
Exchange Server 2007, SC Operations Manager, SC Virtual Machine Manager, SQL Server 2008, SC Data Protection Manager 2007, Windows Compute Cluster Server 2007, Quest Management Shell for Active Directory, Special Operations Software Specops Command, IBM WebSphere MQ, VMWare VI Toolkit, Quest ActiveRoles Server и множество других.
У меня в консоли PowerShell проблемы с отображением русских символов, что делать?
Сам по себе PowerShell прекрасно поддерживает Unicode, чего не скажешь об оболочке командной строки Windows, доставшейся от cmd.exe. Но и это можно поправить. Для начала удостоверьтесь, что в региональных настройках, в опции «Язык для программ, не поддерживающих Unicode», установлен русский язык. Если и это не помогает – попробуйте сменить шрифт, использующийся в консоли, например на Lucida Console.
Русские символы в консоли PowerShell
Не хочу работать в этом ужасном черном окне. Хочу прозрачное окно и прочие «блага цивилизации». Куда податься?
На самом деле PowerShell.exe – это лишь простенький интерфейс для языка, так называемый Хост. И его легко можно сменить на альтернативу, которых уже немало написано. Например, ошарашивающий своими возможностями PowerShell Plus (бесплатен для некоммерческого использования) или PowerShell Analyzer, предоставляющий интерфейс, аналогичный SQL Analyzer. Оба доступны для скачивания на странице https://www.powershell.com. PoshConsole – хост, основанный на Windows Presentation Foundation, можно скачать тут – https://www.codeplex.com/PoshConsole. А фанаты FAR наверняка найдут интересной возможность использовать PowerShell в любимой программе – https://code.google.com/p/farnet/downloads/list. Ну и программисты тоже не останутся обделенными – VS Command Shell позволяет выполнять команды PowerShell из Visual Studio – https://www.codeplex.com/VSCmdShell.
Альтернативная оболочка для PowerShell – PowerShell Plus
А как насчет альтернативы блокноту для написания скриптов?
Для начала – неплохие редакторы встроены в вышеупомянутые PowerShell Plus и PowerShell Analyzer. Известная скриптерам компания Sapien добавила поддержку PowerShell в свою среду разработки Primal Script (https://www.primalscript.com), и выпустила PrimalScope – https://www.primalscope.com. Ну а сам я пользуюсь шустреньким редактором PowerGUI с прекрасным автоматическим дополнением команд и параметров PowerShell и объектов .Net. Кроме того, он обладает превосходным отладчиком и множеством других преимуществ. Кстати, большинство его разработчиков – наши соотечественники.
Редактирование профиля PowerShell с помощью PowerGUI Script Editor
Как выполнить команду на другом компьютере?
К сожалению, PowerShell 1.0 не поддерживает возможность выполнения команд на другом компьютере. Хотя в большинстве случаев дистанционная работа и возможна благодаря WMI, .Net, иногда хочется именно выполнить команду PowerShell на другой системе. А еще здорово бы получить результаты выполнения в виде объектов… На сегодняшний день существует 3 выхода из этого положения: первый это подождать PowerShell 2.0. Там «Remoting» будет на высоте.
Но зачем ждать, если у нас есть возможности PowerShell? Уже сейчас доступна функция Invoke-RemoteCommand, использующяя WinRS (как и PowerShell 2.0) для выполнения команд: https://blogs.msdn.com/powershell/archive/2008/02/29/remoting-using-powershell-v1.aspx.
Ну и, кроме того, можно сделать скрипт Invoke-RemoteExpression использующий утилиту PsExec.exe от SysInternals: https://www.leeholmes.com/blog/UsingPowerShellAndPsExecToInvokeExpressionsOnRemoteComputers.aspx.
Всё здорово, но какие минусы у PowerShell?
Их, к счастью, немного, но они всё же есть.
- PowerShell не работает под Windows 2000. Конечно, он не работает и под Windows 3.11 или 95, но только Windows 2000 пока еще достаточно популярен. Впрочем, конечно, можно использовать WMI для удаленной работы с этой версией.
- PowerShell не отличается большой скоростью выполнения. С этим трудно спорить, даже разработчики это признают. Но для скриптового языка это не является таким уж большим приоритетом – никто не будет писать на PowerShell системы обработки огромных массивов данных. Для этого есть SQL и множество специализированных программ. Зато PowerShell позволяет очень быстро создавать код для автоматизации задач и вследствие этого выигрывать огромное количество времени.
- PowerShell требует установки. Во всяком случае на Windows XP, Vista и 2003. В Windows 2008 и последующих версиях он будет встроенным компонентом системы, но пока это является зачастую значимым недостатком. Хотя стоит отметить, что все стандартные методы автоматизации установки работают. Дистрибутив PowerShell для Windows XP и Windows 2003 понимает ключи /quiet /passive и /norestart, а пакет .msu для Windows Vista вообще можно легко интегрировать в дистрибутив как компонент операционной системы. Подробнее можно узнать тут – https://www.specopssoft.com/powershell.
Итак теоретическая часть вопросов позади. Самые нетерпеливые читатели уже установили PowerShell, прочитали вводную статью Андрея Бирюкова в №11 за 2007 г., и, выполнив команду «Set-ExecutionPolicy RemoteSigned» (для разрешения выполнения скриптов), приступили к изучению. Теперь начинают возникать другие вопросы – практические.
Я нашел в Интернете скрипт PowerShell, который начинается со слова function, как мне его применить?
Обычно можно просто скопировать тело скрипта в буфер обмена и вставить в окно консоли, нажав затем пару раз . После этого можно будет применять эту функцию почти как командлет. Но если вы собираетесь применять его неоднократно – лучше поместить его к себе в файл профиля, чтобы он подгружался автоматически. Либо сделать отдельный файл, например MyFunctions.ps1, и уже его подгружать в профиле, например такой командой:
. c:ScriptsMyFunctions.ps1
Обратите внимание на точку перед вызовом скрипта. Она указывает PowerShell, что его необходимо выполнить в текущем окружении и сохранить все объявленные в нём функции и переменные.
Я нашел скрипт, который начинается со слова Param, что делать в этом случае?
Предполагается, что вы поместите этот скрипт в файл .ps1 и будете вызывать следующим образом:
MyScript.ps1
Если скрипт находится в каталоге, который не содержится в переменной окружения Path, то необходимо указать полный путь к нему. Но если он расположен в текущем каталоге PowerShell, то можно сделать так:
.MyScript.ps1
Точка в данном случае обозначает текущий каталог.
Как использовать переменные окружения?
В PowerShell переменные окружения представлены на специальном виртуальном диске – Env:. То есть теперь можно просто перейти на этот диск с помощью cd Env: и посмотреть переменные окружения, использовав команду Dir (ну или Ls, кому как нравится – всё равно это псевдонимы для Get-ChildItem). Если же нужно использовать переменную окружения, применяется следующая конструкция:
# Выводим имя компьютера на экран $env:computername #переходим в каталог Windows cd $env:windir «Welcome to » + $env:computername + «!»
Более подробно можно прочитать во встроенной справке выполнив команду:
Get-Help About_Environment_variable
Как из результатов выполнения команды выбрать только объекты, удовлетворяющие определенным условиям?
Так как в PowerShell используются объекты, уже не нужно разбирать строки, выдаваемые командой, на части. Достаточно просто работать со свойствами объектов.
Например, для отбора объектов можно использовать командлет Where-Object или его псевдонимы – Where и вопросительный знак.
Выбираем из текущего каталога только файлы с размером более двух килобайт:
dir | where {$_.length –ge 2kb}
В качестве первого аргумента команды Where-Object используется скриптовый блок, если выражение в нём истинно, то объект передается по конвейеру дальше. Внутри блока, переменная $_ представляет текущий объект, и мы можем сравнить его по какому-то критерию с чем-то еще, или произвести любые другие вычисления. В данном случае свойство файла Length (размер файла в байтах) с помощью оператора -ge (больше или равно) сравнивается с значением 2kb (kb – встроенный множитель, равный 1024).
Get-WmiObject win32_share | where {$_.path -like «?:»}
А здесь, получив из WMI список объектов win32_share, мы отбираем лишь те из них, у которых свойство Path подпадает под указанную маску.
Аналогичным образом получаем все процессы, запущенные не из папки Windows и её подпапок, и будто бы завершаем их. Если убрать ключ –whatif, то они будут завершены на самом деле.
ps | where {$_.path –notLike «c:windows*»} | kill -whatif
В этом случае мы используем псевдоним ps для Get-Process и kill для Stop-Process. Но стоп, если просто выполнить команду Get-Process, то мы не увидим свойства Path! И возникает следующий вопрос:
Как узнать какие свойства есть у объекта?
Третья, саsмая полезная команда в PowerShell после Get-Command и Get-Help, это Get-Member. Перенаправив в неё объект (или их коллекцию), можно увидеть свойства и методы, которыми эти объекты обладают. Например, выполнив следующую команду, можно увидеть все свойства объектов типа System.Diagnostics.Process (именно такие нам возвращает команда Get-Process).
Get-Process | Get-Member -MemberType *property
Есть и более наглядный способ посмотреть свойства объекта:
$e = Get-Process explorer $e | Format-List -Property *
Тут мы сначала помещаем в переменную $e объект, представляющий процесс Explorer, а затем выводим его на экран, форматируя в виде списка с помощью командлета Format-List. Для Format-List можно указать список свойств, которые нужно получить, и в нашем случае это простая маска – *. Короче говоря, все свойства. Можно применять псевдоним и просто опустить имя параметра – так будет значительно короче.
$e | fl *
Упомяну еще о третьем способе. Когда вы наберёте $e и нажмёте клавишу табуляции, – будут перебираться все свойства и методы этого объекта. Листать их в обратную сторону можно сочетанием + .
Скрипт PowerTab дополняет свойства объектов не хуже Visual Studio
Разумеется, таким же образом можно исследовать и другие объекты: .Net, WMI, COM, ADSI или любые другие.
Как из текстового файла выбрать строки, содержащие определенный текст? И как насчет регулярных выражений?
Уж не знаю, почему разработчики не сделали для командлета Select-String псевдоним grep, но ничего не мешает сделать его самостоятельно:
New-Alias grep Select-String
Впрочем, точной копией grep это всё равно не будет, так что я предпочитаю еще более короткий вариант:
New-Alias ss Select-String
Ну и дальше анализируем файлы:
Select-String 3389 C:WindowsSystem32driversetcservices
Эта команда вернёт две строчки, в следующем формате: «имя_файла:номер_строки:текст».
Если же у вас задача получить только текст, – не надо пытаться парсить эти строки! Командлет Select-String тоже возвращает объекты, и достаточно лишь выбрать нужное свойство, в данном случае это Line.
ss 3389 C:WindowsSystem32driversetcservices |%{$_.Line}
Тут я использовал % – это псевдоним для командлета ForEach-Object. И для каждого объекта получаем его свойство Line.
Я показал лишь маленькую толику возможностей Select-String. Этот командлет работает с регулярными выражениями и может обрабатывать несколько файлов сразу. Можно, например, перенаправить на него вывод команды Dir:
dir c:windows*.log | Select-String «Error»
Раз уж заговорили о регулярных выражениях, как еще можно с ними работать?
Следующий абзац для тех, кто пока не знаком с регулярными выражениями. Вы наверняка не раз использовали маски «*» или «?» для обозначения нескольких похожих имен файлов и других подобных задач в командной строке. Регулярные выражения – это, можно сказать, продолжение идеи. Хотя их синтаксис гораздо сложнее, взамен они позволяют описывать практически любые условия, вытаскивать из строк необходимые подстроки и еще много полезных вещей. Подробно на синтаксисе я останавливаться не буду, даже его краткий обзор – это тема для отдельной статьи.
Кроме командлета Select-String, нам доступен еще оператор -match. Он позволяет проверить – подпадает ли строка под регулярное выражение и возвращает соответственно $True или $False в качестве результата.
Например, следующая команда вернёт $True.
«[email protected]» -match «S+@S+»
На всякий случай поясню: «S+» означает «любой символ, кроме пробела («S») в количестве от 1 и более («+»)». Ну а символ @ подразумевает сам себя.
Конечно, можно использовать еще и «группы захвата», чтобы разбивать строку на компоненты. Эти группы создаются путем помещения отдельных элементов регулярного выражения в круглые скобки. После выполнения оператора -match группы помещаются в специальную переменную $matches.
if («[email protected]» -match «(S+)@(S+)») {$matches[2]}
Здесь будет возвращено содержимое второй группы – домен почтового адреса.
Поддерживаются практически все возможности регулярных выражений .Net.
Так, например, используются именованные группы:
«Е-mail» -match «(?<?Имя>S+)@(?<?Домен>S+)»
Теперь можно получить значения так:
$matches[«Домен»]
Или даже так:
$matches.Имя
Еще один оператор, работающий с регулярными выражениями, это -replace. С его помощью легко заменить текст, используя всё те же регулярные выражения. В качестве первого операнда указывается обрабатываемая строка (или массив строк), а в качестве второго – массив из двух элементов.
Первый из них – искомое выражение, а второй – то, на что будет произведена замена.
Так, например, следующая команда возвратит строку «PowerShell»:
«SimpleShell» -replace «Simple»,»Power»
Если второй элемент массива не указывать, то весь текст, подпадающий под выражение, будет удалён.
«PowerShell» -replace «[wrel]»
Эта команда удалит из строки все символы w, r, e и l. В результате мы получим «Posh». В -replace тоже можно применять группы захвата:
«PowerShell» -replace «(.{5})(.{5})»,»$2$1?
Эта строчка вернёт нам значение «ShellPower».
Кстати, я не просто так поместил последнюю строчку в одинарные кавычки. Дело в том, что символ $ используется в PowerShell для обозначения переменных, и в строке, окруженной двойными кавычками, он попытается заменить $1 и $2 значениями соответствующих переменных.
В случае же, если всех вышеперечисленных методов недостаточно, можно использовать класс System.Text.RegularExpressions.Regex из .Net Framework. Создать его экземпляр можно, например, таким образом:
[regex]$r = «[,;]»
А затем посмотреть все его методы с помощью команды Get-Member:
$r | Get-Member -MemberType method
Так только с помощью System.Text.RegularExpressions.Regex можно применить метод Split:
$r.Split(«1;2,3,4,5;6»)
Как заставить PowerShell сравнивать строки (-eq, -match, -like) учитывая регистр символов?
Все операторы, работающие со строками, имеют версии, чувствительные к регистру символов. Отличаются они лишь приставленной спереди буквой «c» (от Case sensitive).
Так, команда:
«Test» -eq «test»
вернёт $True, а вот:
«Test» -ceq «test»
уже $False. Кстати, то же самое правило относится и к операторам -match и -replace.
Как посмотреть что это за команды – «%», «gps» или «ft»?
Достаточно воспользоваться командлетом Get-Command:
Get-Command %, gps, ft
Выполнив эту команду, мы увидим, что вышеперечисленные символы – псевдонимы (Alias) для командлетов Foreach-Object, Get-Process и Format-Table соответственно.
В качестве аргумента может быть не только командлет или алиас PowerShell. В данном случае мы узнаем полный путь к исполняемому файлу ping.exe.
Get-Command ping
Как изменить приглашение командной строки?
Для этого достаточно переопределить функцию Prompt, например, получить приглашение в формате пользователь@компьютер:каталог> можно таким образом:
# Название функции function prompt { # Бонус! Выводим полный путь в заголовок окна $host.UI.RawUI.WindowTitle = Get-Location ; # Получаем из переменной окружения имя пользователя $env:username + «@» + # Имя компьютера $env:computername + «:» + # И последний элемент текущего каталога (get-location | split-path -leaf) + «> «}
Безусловно, выполнять такой код каждый раз при запуске PowerShell не очень то интересно, поэтому возникает следующий вопрос:
Как создать/изменить профиль?
На всякий случай уточню – профиль PowerShell – это файл скрипта, который выполняется автоматически при каждом запуске консоли PowerShell. Изначально при установке PowerShell не создает его, но это легко исправить следующей командой:
New-Item -type file -Path $PROFILE -Force
Это создаст пустой файл профиля. Открыть его проще всего так:
notepad $PROFILE
Ну и дальше всё в ваших руках. Туда можно поместить команды для загрузки необходимых оснасток, объявления функций и псевдонимов и т. п.
Понял, что деваться некуда, хочу учиться. Какая литература есть по PowerShell?
Литературы множество, но, к сожалению, пока очень мало что доступно на русском языке. Правда, кое-что всё же есть.
- Прилагающаяся документация переведена на несколько языков, включая русский! Её можно получить, либо установив локализованный дистрибутив PowerShell (меню «Пуск/Все программы/Windows PowerShell»), либо скачав отдельно WindowsPowerShell_Localized_DocumentationPack.zip со страницы https://www.microsoft.com/downloads/details.aspx?FamilyID=b4720b00-9a66-430f-bd56-ec48bfca154f.
- Если вы установили локализованный PowerShell, то у вас будет не только русская документация, но и встроенная справка. Её можно посмотреть с помощью команды Get-Help или Man – кому как привычнее.
- Статья «Знакомимся с PowerShell – новой командной оболочкой» Андрея Бирюкова в журнале за ноябрь 2007 года. Также она доступна в Интернете по адресу https://www.samag.ru/cgi-bin/go.pl?q=articles;n=11.2007;a=01.
- Русскоязычные блоги (с PowerShell так сложилось, что дневники разработчиков и просто энтузиастов являются бесценным источником информации о языке. Ну и, кроме того, там можно найти множество примеров скриптов. На русском языке мне пока известны следующие активные блоги: https://xaegr.wordpress.com – блог вашего покорного слуги;
- https://blogs.technet.com – журнал Андрея Бешкова, специалиста по инфраструктурным решениям Microsoft;
- https://www.itcommunity.ru/blogs/dmitrysotnikov/default.aspx – русскоязычный дневник Дмитрия Сотникова, работника Quest Software, одного из создателей PowerGUI и AD Cmdlets.
Если же английский язык не является преградой, то объем доступной литературы сильно увеличивается. В частности, по PowerShell уже выпущено огромное количество книг. Перечислять их все не имеет смысла – я уверен, что все читатели журнала сумеют воспользоваться поиском по слову PowerShell. Я лишь отмечу те, что прочитал сам и рекомендую другим:
- PowerShell in Action – это книга от одного из разработчиков PowerShell Брюса Пэйета (Bruce Payette). Превосходная книга не только для начинающих, но и для профи. В первой части постепенно раскрываются основы языка, но при этом разъясняется не только «Как оно работает?» но и «Почему оно работает так?». Во второй же части книги следуют более сложные темы с примерами реальных задач.
- PowerShell Cookbook от O’Reilly. Эта книга прекрасно дополняет PowerShell in Action, используя совершенно другой подход. Практически вся книга составлена из пар задача – решение, что превращает её в превосходный сборник рецептов.
Еще стоит упомянуть пару книг от работника немецкого подразделения Microsoft – Frank Koch. Эти книги доступны на английском и немецком языках для свободного скачивания в Интернете.
- PowerShell course book – https://blogs.technet.com/chitpro-de/archive/2007/05/10/english-version-of-windows-powershell-course-book-available-for-download.aspx.
- Administrative tasks using Windows PowerShell – https://blogs.technet.com/chitpro-de/archive/2008/02/28/free-windows-powershell-workbook-server-administration.aspx.
Англоязычные блоги. Стоит посмотреть, даже если вам не очень легко воспринимать английский язык, ведь PowerShell зачастую выполняет ту задачу, для которой был придуман эсперанто.
- https://blogs.msdn.com/powershell – официальный блог PowerShell. Разработчики пишут сюда интересные новости о PowerShell, занимательный код и сообщают об интересных событиях.
- https://thepowershellguy.com – блог //o//, одного из Гуру PowerShell, автора PowerTab и PowerShell WmiExplorer. Тут можно почитать много интересного о работе с ADSI, WMI и посмотреть на множество классных скриптов.
- https://dmitrysotnikov.wordpress.com – англоязычный блог Дмитрия Сотникова.
- https://www.leeholmes.com/blog – дневник Lee Holmes. Один из разработчиков PowerShell, а также автор PowerShell Cookbook и системы автоматического кормления кошки с помощью PowerShell скрипта.
Ну и, конечно, стоит заглянуть на официальную страницу – https://microsoft.com/powershell и в Script Center – https://www.microsoft.com/technet/scriptcenter, где можно найти, например, руководство по конвертации скриптов из VBScript – https://www.microsoft.com/technet/scriptcenter/topics/winpsh/convert.
Кстати, все эти ссылки (и еще много других) доступны на моей страничке, где я их собираю, – https://windowspowershell.ru или https://xaegr.wordpress.com/poshlinks.
Получение сведений об объектах
Возможно, у читателя уже возник вопрос — а как, вообще говоря, можно узнать, какую информацию можно получить в результате выполнения той или иной команды? Какие действия можно произвести с полученными данными? Например, в вышеописанном случае, откуда можно было узнать, что мы сможем получить дату создания файла? Одним из простых способов анализа объекта, возвращаемого командой, является передача этого объекта на вход командлета Get-Member. Этот командлет выводит сведения о типе объекта и всех его элементов. Как правило, объекты имеют большое количество разнообразных свойств и результатом работы Get-Member может стать весьма объемный текст, который не очень удобно просматривать. В этом случае можно либо разделять информацию на части, либо ее отфильтровывать. Пример получения информации об объекте, возвращаемом командлетом Get-Process, просмотр которой можно осуществлять постранично:
Get-Process | Get-Member | Out-Host -Paging
По заполнении страницы, пользователь может выбрать один из вариантов — вывести еще одну страницу, вывести еще одну строку или прекратить вывод данных. Фильтрация данных выполняется при помощи параметра MemberType, определяющего, сведения какого рода должны быть выведены. Например, команда
Get-Process | Get-Member -MemberType Properties
выведет лишь свойства объекта, а
Get-Process | Get-Member -MemberType Methods
— лишь его методы. Еще один способ посмотреть свойства объекта — присвоить переменной объект, затем набрать в консоли имя переменной, поставить точку и нажать клавишу Tab. С каждым нажатием клавиши PowerShell будет перебирать и подставлять методы и свойства объекта. Перебор в обратную сторону возможен с помощью сочетания клавиш Shift+Tab.
Использование в повседневности
Данным инструментом пользуются многие IT-специалисты и администраторы и не зря, так как он дает большие возможности и снижает время, на выполнение каких-либо задач.
Если пользователь имеет в своем пользовании большую сеть, которая состоит из нескольких сотен серверов, то нужно будет внедрить систему безопасности, которая будет работать при использовании определенной службы. Проблема в том, что нужно проверить, установлена ли данная служба на всех серверах. Конечно, можно подключится вручную к каждому серверу, но руководству это не очень понравится, так как на выполнение такой задачи уйдет очень много времени.
Чтобы сократить время работы до нескольких минут, можно воспользоваться PowerShell, с помощью которого, мы при помощи одного сценария соберем всю необходимую информацию и сохраним ее в отдельный документ.
Также, о данном инструменте написано не мало книг, все-таки данный инструмент дает широкие возможности, которые вряд ли опишутся в данной статье полноценно. Таким образом, если вас заинтересовала данная тема, вы можете ее начать ее изучать более подробно.
Безопасность
Как уже отмечалось, использование сценариев VBScript/JScript представляет потенциальную опасность для системы — для их исполнения достаточно щелкнуть по значку мышью. Опасность еще более возрастает, если пользователь вошел под учетной записью, входящей в группу администраторов. В PowerShell скрипт с расширением ps1 невозможно запустить на исполнение с помощью мыши — в системе такой файл будет открыт не в командной оболочке, а в Блокноте. Для запуска сценария необходимо запустить саму оболочку PowerShell, ввести имя файла и нажать клавишу Enter.
В новой оболочке так же невозможна подмена команд. Суть этого приема, применяемого злоумышленниками, заключается в следующем. Обычно у пользователя, не имеющего прав администратора, есть некоторые папки с разрешениями на запись и выполнение файлов. Характерный пример — папка C:\Documents and Settings\имя_пользователя. Вредоносная программа создает в такой папке исполняемый файл с именем, совпадающим с именем команды оболочки или именем исполняемой системной программы. К примеру, я создал в «своей» папке документов ipconfig.vbs, выводящий простое сообщение. Теперь, если, запустив cmd.exe, и находясь в своей папке, я попытаюсь выполнить команду Windows ipconfig, то получу вот такой результат:
Для полноты иллюстрации можно поместить в папку с документами и исполняемый файл, переименованный в нашем случае в ipconfig.exe. Тогда даже при вызове с указанием расширения будет запускаться файл из текущей папки, а не из \system32. С PowerShell такой фокус не пройдет — для вызова скрипта, путь к которому не совпадает с путями, заданными в системной переменной %Path, необходимо явно указать его расположение. Даже в том случае, когда скрипт расположен в папке, являющейся для оболочки текущей, необходимо указать путь в таком виде: .\имя_файла. Точка с обратным слешем указывают интерпретатору на текущую папку.
Еще одним механизмом обеспечения безопасности является политика выполнения сценариев. Изначально оболочка настроена так, что даже при правильном вызове сценария его выполнение будет запрещено, а пользователь получит соответствующее сообщение. Политика выполнения может переключаться в один из четырех режимов:
- Restricted — настройка по умолчанию, запуск любых сценариев запрещен
- AllSigned — разрешен запуск сценариев, имеющих цифровую подпись надежного издателя; сценарии, созданные пользователем, также должны быть заверены центром сертификации
- RemoteSigned — разрешен запуск сценариев, если они не являются доверенными, но созданы локальным пользователем; сценарии, загруженные из Интернета, не имеющие подписи, не исполняются
- Unrestricted — разрешен запуск любых сценариев
Текущий режим политики можно узнать, выполнив команду Get-ExecutionPolicy в оболочке. Для изменения режима выполните команду Set-ExecutionPolicy с необходимым названием политики в качестве параметра.
Также к инструментам, помогающим повысить безопасность при работе с PowerShell, я бы отнес параметры команд из разряда «а что будет, если…». Их два — whatif и confirm. Первый позволяет определить, какое действие и с каким объектом будет произведено, однако само действие реализовано не будет. Что-то вроде моделирования. Второй перед выполнением действия будет запрашивать подтверждения пользователя, и в случае утвердительного ответа — запускать необходимую команду фактически. То есть, такой вид подстраховки.
Приведу, пожалуй, наиболее яркий и забавный пример использования этих параметров. Если пользователь попытается выполнить команду:
Get-Process | Stop-Process
то через несколько секунд его будет ждать синий экран со STOP-ом. PowerShell, как и следует из текста команды, последовательно начнет «прибивать» все запущенные в системе процессы, что и приведет к ее критическому останову. Если же запустить:
Get-Process | Stop-Process -whatif
ничего страшного не произойдет — просто PowerShell покажет, что бы он сделал, если бы команда выполнялась без ключа -whatif:
Исправьте ошибки powershell.exe
- 1 Информация о файле powershell.exe
- 2 Ошибки, связанные с файлом powershell.exe
- 3 Как исправить ошибки, связанные с powershell.exe?
- 3.1 Сканирование на наличие вредоносных программ
- 3.2 Обновление системы и драйверов
- 3.3 Инструмент проверки системных файлов
- 3.4 Восстановление системы
- 4.1 Список версий файла powershell.exe
Информация о файле
Основная информация | |
Имя файла | powershell.exe |
Расширение файла | EXE |
Описание | Windows PowerShell |
Программного обеспечения | |
программа | Microsoft® Windows® Operating System |
автор | Microsoft Corporation |
подробности | |
MIME тип | application/octet-stream |
Тип файла | Executable application |
система | Windows NT 32-bit |
Авторские права | © Microsoft Corporation. All rights reserved. |
Набор символов | Unicode |
Языковая треска | English (U.S.) |
Псевдонимы
Оболочка имеет встроенный механизм псевдонимов команд. С одной стороны, псевдонимы используются для упрощения ввода команд. Как правило, в этом случае в качестве псевдонима используется сокращенное наименование командлета (например, gc для Get-Content или fl для Format-List). С другой стороны, этот механизм обеспечивает совместимость интерфейсов различных командных интерпретаторов. К примеру, имея опыт работы с cmd.exe, вы привыкли выводить содержимое папки с помощью команды dir. Выполнение этой команды в PowerShell приведет к тому же результату, хотя на самом деле оболочка вместо псевдонима dir будет выполнять командлет Get-ChildItem. Список всех доступных псевдонимов можно получить с помощью команды Get-Alias. Пользователь может создавать собственные псевдонимы, используя команду Set-Alias.
Что такое Windows PowerShell ISE
Windows PowerShell ISE (интегрированная среда сценариев) – это приложение, появившееся в PowerShell 2.0. Она позволяет запускать команды и писать, тестировать и отлаживать сценарии в едином графическом интерфейсе пользователя на базе Windows.
Этот ISE включает командную панель, одну для сценариев и одну для вывода. Панель вывода отображает результаты команд, запущенных в двух других панелях. Кроме того, графическое окружение можно изменить, выбрав расположение блоков.
PowerShell ISE поддерживает многострочное редактирование, окрашивание синтаксиса, завершение с помощью клавиши TAB и выборочное выполнение и использует собственный профиль, отличный от того, который используется для настройки PowerShell.
Диски PowerShell
Так же, как Windows оперирует с данными, используя файловую систему, оболочка PowerShell работает с хранилищами данных, представленных в виде дисков. Физические диски системы являются не единственным встроенным в оболочку видом хранилищ, с которыми обеспечивается взаимодействие. Пользователь может работать с реестром, встроенными переменными и переменными среды, хранилищами сертификатов точно так же, как и с обычными дисками, папками и файлами. Реализация такого взаимодействия и обеспечение абстракций, позволяющих пользователю применять одинаковые команды и методы к различным хранилищам данных, выполняется провайдерами — программами .NET.
Список провайдеров, доступных в данный момент оболочке, можно получить командой Get-PSProvider. Изначально в PowerShell присутствуют следующие «диски» — псевдонимы (Alias), переменные среды (Env), физические диски системы (C, D, и т. д.), функции, системный реестр, внутренние переменные (Variable) и хранилище сертификатов.
Вот пример чтения содержимого ветки реестра HKLM\Software\Microsoft
Как видно, использованы те же команды, что для получения сведений о файловой системе. Но структура получаемых данных, естественно, различна. Кроме названия и свойств для каждого элемента выводится номер подраздела (SKC) и номер записи (VC). С помощью PowerShell пользователь может просматривать сведения о реестре, добавлять, удалять и модифицировать ключи. Позволю привести себе что-то вроде шпаргалки по работе с элементами реестра:
И код для примера выполнения различных манипуляций с ключами реестра и их параметрами:
# Создаем новый подраздел с именем valks в ветке HKEY_CURRENT_USER\Software New-Item -path HKCU:\Software\valks # Добавляем в созданный раздел новый строковый параметр с именем Param1 и значением StringValue New-ItemProperty -path HKCU:\Software\valks -name Param1 -propertyType String -value StringValue # Создадим подраздел SubFolder New-Item -path HKCU:\Software\valks\SubFolder # Добавляем еще один параметр — Param2 типа DWord и значением 12 New-ItemProperty -path HKCU:\Software\valks -name Param2 -propertyType DWord -value 12 # Получаем список всех параметров Get-ItemProperty HKCU:\Software\valks # Получаем значение параметра Param2 Get-ItemProperty HKCU:\Software\valks | Format-list Param2 # Или можем считать раздел в переменную $key $key = Get-ItemProperty HKCU:\Software\valks # И вывести значение нужного параметра Write-Host «Значение параметра Param2: » $key.Param2 # Изменим значение параметра Param2 на 193 Set-ItemProperty HKCU:\Software\valks -name Param2 -value 193 # Изменим название параметра Param1 на Параметр1 Rename-ItemProperty -path HKCU:\Software\valks -name Param1 -newname Параметр1 # Удаляем Параметр1 Remove-ItemProperty HKCU:\Software\valks -name Параметр1 # Удаляем весь подраздел valks Remove-Item HKCU:\Software\valks
Вот еще небольшой пример в виде функции, которая осуществляет поиск программ, автоматически загружающихся при старте системы. Область поиска определяется массивом, включающим в себя некоторые известные точки автозапуска в реестре. Код содержит комментарии, надеюсь, они пояснят суть работы.
function GetAutoexec ($hives) { # Если функции не передается входной массив ключей реестра, # используем этот: $hives = «HKCU:\Software\Microsoft\Windows\CurrentVersion\Run», ` «HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run», ` «HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\Run» # Выодим заголовок и переносим строку Write-Host «Список автозагрузки`n» # Начинаем перебирать элементы массива — ветви реестра Foreach ($hive in $hives){ # Выводим название ветви зеленым цветом Write-Host «Ветвь $hive» -ForegroundColor Green # Проверяем, существует ли ветвь в реестре if (Test-Path $hive){ # Получаем очередной ключ реестра [Microsoft.Win32.RegistryKey]$param = Get-Item $hive # для каждого ключа… foreach ($p in $param){ # …получаем список его параметров foreach ($key in $p.getvalueNames()){ # выводим название параметра и его значение «Загрузка $key из » + $p.GetValue($key) } } } # переносим строку Write-Host «`n» } } # осуществляем вызов самой функции GetAutoexec
Пользователь может создавать собственные диски, используя существующие провайдеры. Вот пример создания диска PowerShell с именем Win, содержимое которого будет являться корневой папкой C:\Windows:
New-PSDrive -Name Win –PSProvider FileSystem -Root «C:\Windows»
После создания диска PowerShell к нему можно обращаться точно так же , как к обычному диску системы.
Однако необходимо знать, что по завершении сеанса работы с PowerShell он будет автоматически удален. Так же, как и псевдонимы, функции и переменные, созданные пользователем в течение сеанса. Для того, чтобы сохранить перечисленные изменения, необходимо создать профиль PowerShell.
Начинаем исследование
На первый взгляд синтаксис командной оболочки кажется немного запутанным, но в действительности все понятно и логично. Названия командлетов стандартизированы, имена выглядят как «действие-объект». Так, чтобы получить данные объекта, используем действие «Get-*», установить «Set-*», остановить – «Stop-*», вывод – «Out-*» и т.д. Список всех доступных команд можно просмотреть, выполнив «Get-Command». Для получения помощи набираем «Get-Help». К примеру, просмотрим список процессов, рассортируем их по использованию процессорного времени в убывающем порядке и выберем 10 самых прожорливых:
PS> Get-Process | Sort CPU -Descending | Select -First 10
Все просто! Попробуем потушить самый жадный до CPU процесс:
PS> Get-Process | Sort CPU -Descending | Select -First 1 | stop-process
Чтобы узнать, какие диски доступны, вводим:
PS> Get-PSDrive
Обрати внимание, что в списке будут присутствовать и ветки реестра HKCU и HKLM, к которым можно обратиться как к обычному диску:
PS> cd HKLM: PS HKLM>
Теперь можно перемещаться по выбранной ветке, просматривать, создавать и удалять объекты. Для PowerShell разработано большое количество командлетов, и если ты не хочешь повторно изобретать колесо, вполне естественно посмотреть на результаты работы других администраторов. Сообществом PowerShell создан репозитарий командлетов PoshCode Cmdlets, который является неким аналогом Perl CPAN. Здесь можно найти решения практически на все случаи. Например, нужен снифер на PowerShell? Нет ничего проще! Качаем с сайта файл Get-Packet.ps1 и запускаем:
PS> Get-Packet.ps1 -Statistics
Все параметры описаны внутри файла. Другой командлет Analyze-Packet позволит получить детальную статистику по пакетам.
По умолчанию выполнение сценариев в PowerShell запрещено, поэтому не все команды удастся запустить. Просмотреть текущий статус политики выполнения можно командой:
PS> Get-ExecutionPolicy AllSigned
Существует четыре типа политики:
- Restricted — возможно выполнение отдельных команд, сценарии запрещены;
- AllSigned — разрешено выполнение подписанных сценариев, перед запуском запрашивается подтверждение;
- RemoteSigned – похож на предыдущий, не запрашивается выполнение сценариев, подписанных надежным издателем, не требуется подпись для локальных сценариев;
- Unrestricted – можно запускать неподписанные сценарии.
PS> Set-ExecutionPolicy RemoteSigned
Профили PowerShell
Профиль — это файл с расширением ps1. Фактически, это тот же скрипт, выполняемый оболочкой при ее запуске. Профили в оболочке не создаются автоматически — они должны быть созданы пользователем самостоятельно. Созданные профили будут загружаться при каждом запуске PowerShell, если политикой выполнения разрешено загружать конфигурационные файлы. Возможна обработка до четырех различных профилей. Расположение файлов в порядке последовательности их загрузки:
- %windir%\system32\WindowsPowerShell\v1.0\profile.ps1 — профиль, применяемый ко всем пользователям и оболочкам
- %windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1 — профиль, применяемый ко всем пользователям только оболочки PowerShell
- %UserProfile%\My Documents\WindowsPowerShell\profile.ps1 — применяется для текущего пользователя во всех оболочках
- %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 — применяется для текущего пользователя только в оболочке PowerShell
Под различными оболочками здесь нужно учитывать то обстоятельство, что PowerShell может оказаться не единственным приложением, использующим файлы профилей ps1. Некоторые интегрированные среды разработки (IDE) также могут использовать их. Один из характерных примеров — инструмент PowerGUI, разработанный Quest Software, предоставляющий средства графического интерфейса для работы с PowerShell.
Путь к профилю текущего пользователя только оболочки PowerShell хранится во встроенной переменной $profile. Для его создания выполните команду:
New-Item -Path $profile -ItemType file -force
После создания его можно открыть любым текстовым редактором, например Блокнотом:
notepad $profile
и сделать в нем необходимые изменения. Не забудьте проверить, разрешен ли политикой выполнения запуск скриптов.
Полезные мелочи
Если приходится часто вводить одинаковые команды, воспользуйся алиасами. Для начала взглянем на список предустановленных псевдонимов:
PS> get-alias
Например, вместо «Get-Process» можно ввести просто «gps». Задать свой алиас очень просто:
PS> Set-Alias d Get-Date
Теперь чтобы вывести дату, достаточно набрать «d». Если в скриптах некоторый код повторяется несколько раз, имеет смысл использовать функции:
function <?имя> {<?код>}
Очень удобно, что все функции, объявленные во время текущего сеанса консоли, запоминаются, и к ним можно обращаться по мере необходимости.
В чем работать с PowerShell?
Командная строка (хост) PowerShell.exe имеет простой интерфейс, и несколько неудобна при повседневном использовании и тестировании скриптов. При постоянной работе лучше подыскать альтернативные решения, благо их сегодня предостаточно. Например, бесплатный для некоммерческого использования PowerShell Plus или PowerShell Analyzer. Хост PoshConsole, основанный на графической подсистеме WPF (Windows Presentation Foundation), обладает интересным режимом QuakeMode (Get-QuakeMode), эмулирующим вид консоли популярной игры. Очень удобен редактор PowerGUI, созданный нашими соотечественниками, с автоматическим дополнением команд, хорошим отладчиком, возможностью поиска командлетов в репозитарии PoshCode Cmdlets и многими другими функциями. Поклонники FAR наверняка оценят наличие плагина для этого файлового менеджера — FarNet.
Работа с объектами WMI
WMI (Windows Management Interface, интерфейс управления Windows) — набор интерфейсов для управления ОС Windows с помощью специальных компонентов. Возможно управление локальным компьютером, и находящимся в сети. WMI — разновидность Web-Based Enterprise Management (WBEM) и Common Information Model (CIM), разработанная Microsoft. Входит в состав Windows Vista, Windows Server 2003, Windows XP, Windows Me и Windows 2000. Для Windows 95 и Windows 98 доступна в виде отдельно устанавливаемого компонента. Поддерживает использование скриптовых языков, таких как VBScript или Windows PowerShell для управления персональными компьютерами и серверами, работающими под управлением Microsoft Windows.
Объекты WMI являются для PowerShell вполне «родными». Достаточно выполнить команду:
Get-WmiObject -List
чтобы увидеть большое количество классов, обеспечивающих доступ к объектам WMI в оболочке. В случае подключения к WMI на удаленном компьютере, состав классов будет зависеть от ОС и установленных на нем расширений WMI. Для получения сведений о доступных классах на удаленной машине, необходимо указать его IP-адрес или имя в качестве параметра:
Get-WmiObject -List -ComputerName Server
Для успешного подключения на удаленном компьютере должен быть запущен интерфейс WMI, а используемая учетная запись должна входить в группу локальных администраторов.
Если не использовать специальное указание, некоторые сведения не выводятся, видимо из соображений «не захламлять экран». Для получения более детальной информации можно воспользоваться командами форматирования и отбора данных.
PS C:\Documents and Settings\Администратор> Get-WmiObject -Class Win32_OperatingSystem SystemDirectory : C:\WINDOWS\system32 Organization : Nrest BuildNumber : 3790 RegisteredUser : Сергей SerialNumber : 69889-650-3137304-45684 Version : 5.2.3790 PS C:\Documents and Settings\Администратор> Get-WmiObject -Class Win32_OperatingSystem | Format-List Locale, Version, CurrentTimeZone, OSLanguage, InstallDate Locale : 0419 Version : 5.2.3790 CurrentTimeZone : 180 OSLanguage : 1049 InstallDate : 20081022233211.000000+240
А вот небольшой пример опроса всех компьютеров в локальной сети с адресом 192.168.1.0 и маской подсети 255.255.255.0:
1..254| ForEach-Object -Process { Get-WmiObject -Class Win32_PingStatus -Filter («Address=’192.168.1.» + $_ + «‘») -ComputerName . } | Select-Object -Property Address,ResponseTime,StatusCode
В первом элементе конвейера генерируется массив чисел от 1 до 254. На втором этапе каждое число из массива подставляется в IP-адрес, который будет пинговаться при помощи средств WMI. Результаты будут выводиться в таблицу с тремя столбцами — адрес хоста, время отклика и статус ответа. В случае ответа хоста возвращается статус с кодом «0».
Командлеты PowerShell для удаленного управления
С помощью Windows PowerShell можно выполнять команды не только на локальном компьютере, но и на одном или даже на нескольких удаленных компьютерах.
- Enter-PSSession — запускает интерактивный сеанс с удаленным компьютером;
- Exit-PSSession — завершает интерактивный сеанс с удаленным компьютером;
- New-PSSession — создает постоянное подключение к локальному или удаленному компьютеру;
- Remove-PSSession — закрывает один или несколько сеансов Windows PowerShell;
- Disconnect-PSSession — отсоединяется от сеанса;
- Connect-PSSession — подключается к отключенным сеансам;
- Get-PSSession — получает сеансы Windows PowerShell на локальных и удаленных компьютерах;
- Invoke-Command — выполняет команды на локальном и удаленных компьютерах.
INFO
PowerShell — это расширяемая оболочка с интерфейсом командной строки и сопутствующий язык сценариев. Упрощает выполнение часто используемых задач, позволяет сократить время администрирования рабочих станций и серверов, а также обеспечивает возможность тонкой настройки компонентов ОС Windows.
Сегодня PowerShell является частью ОС Win2k8R2 и Win7 и встроен в графические консоли администрирования последних продуктов Microsoft (например, Exchange 2007 и System Center 2007).
Интерфейс программирования приложений ADSI предназначен для доступа к службе Active Directory и позволяет создавать, изменять и удалять объекты в каталогах, выполнять поиск и множество других операций.
При использовании QAD команды для работы с AD выглядят на порядок проще, а скрипты читабельнее.
QAD командлеты понадобятся в случае использования некоторых GUI к PowerShell, в которых имеется функция для работы с Active Directory (например, PowerGUI).
Производители программного обеспечения не остаются в стороне и разрабатывают большое количество командлетов.