Знакомство с 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 — несложный язык, и, я думаю, ты быстро разберешься, что к чему. Команды здесь называются командлетами, и каждый из них состоит из двух частей. Сначала идет действие, например Get, Set, Add, Invoke, Remove. Затем указывается то, на что действие направлено: Service, VM, AzureAccount, DHCPServerSetting. Каждая часть отделяется от другой дефисом. Получается, к примеру, get-process. Это, кстати, полезная команда, которая выводит список процессов. Скажем, если написать
get-process BadTh*
увидим что-то такое:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ——— ——— ——— ——— ——— ——— ——— ——— 28 4 -210844 -201128 -163 25.67 2792 BadThread
Получение сведений об объектах
Возможно, у читателя уже возник вопрос — а как, вообще говоря, можно узнать, какую информацию можно получить в результате выполнения той или иной команды? Какие действия можно произвести с полученными данными? Например, в вышеописанном случае, откуда можно было узнать, что мы сможем получить дату создания файла? Одним из простых способов анализа объекта, возвращаемого командой, является передача этого объекта на вход командлета 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.
Фоновое исполнение заданий
В Windows PowerShell есть возможность фонового исполнения заданий, она представляет собой механизм, с помощью которого можно запустить на выполнение команду (например, которая долго выполняется) в фоновом режиме, т.е. после запуска Вы возвращаетесь в текущую сессию и можете продолжить работу, не дожидаясь окончания работы команды. Данная возможность Вам понадобится тогда, когда у Вас возникнет необходимость запустить команду, работа которой занимает достаточно продолжительное время, а как Вы знаете, в течение этого времени сессия оболочки PowerShell блокируется до завершения работы команды, а Вам нужно продолжать работать.
Всеми заданиями, которые запущенны в фоновом режиме, Вы можете управлять, например, посмотреть список заданий, остановить работу задания, удалить задание, и, конечно же, посмотреть результат работы задания.
В Windows PowerShell для работы с фоновыми заданиями есть следующие командлеты:
- Start-Job – запустить фоновую задачу;
- Stop-Job – остановить фоновую задачу
- Get-Job – посмотреть список фоновых задач;
- Receive-Job – посмотреть результат выполнения фоновой задачи;
- Remove-Job – удалить фоновую задачу;
- Wait-Job – перевести фоновую задачу на передний план, для того чтобы дожидаться ее окончания.
Для запуска в фоновом режиме необходимо написать команду Start-Job, а в фигурных скобках {} команду или набор команд, которые необходимо выполнить в фоновом режиме.
Например, давайте запустим какую-нибудь задачу (показать список служб) в фоновом режиме, затем посмотрим на список фоновых заданий и выведем на экран результат работы нашего задания (т.е. список служб).
Запуск задачи в фоновом режиме
1 | Start-Job {Get-Service} |
Смотрим на список задач запущенных в фоновом режиме
1 | Get-Job |
Отображаем результат работы задания Job1
1 | Receive-Job Job1 |
Как видим, у нас появилась задача со статусом «Completed», т.е. она уже выполнилась (просто Get-Service отрабатывает быстро).
Для того чтобы посмотреть результат работы фоновой задачи, т.е. командлета Get-Service, мы выполнили команду Receive-Job и передали ей имя задания (можно и значение идентификатора). В результате у нас отобразился список служб.
Безопасность
Как уже отмечалось, использование сценариев 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:
Начинаем исследование
На первый взгляд синтаксис командной оболочки кажется немного запутанным, но в действительности все понятно и логично. Названия командлетов стандартизированы, имена выглядят как «действие-объект». Так, чтобы получить данные объекта, используем действие «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
Псевдонимы
Оболочка имеет встроенный механизм псевдонимов команд. С одной стороны, псевдонимы используются для упрощения ввода команд. Как правило, в этом случае в качестве псевдонима используется сокращенное наименование командлета (например, 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.
Работаем с Active Directory
Используя командлеты, можно выполнять все операции с Active Directory — создавать, удалять, изменять, просматривать свойства объектов, перемещать, переименовывать и восстанавливать объекты, управлять группами, ролями FSMO, доменами и лесами, настраивать политики и многое другое. Обращение к AD происходит через ADSI путем опроса пространства имен «System.DirectoryServices» .NET Framework. Но при использовании ADSI даже простые команды выглядят довольно пугающе для новичков (я уже не говорю о сложных конструкциях). Для примера зададим путь к контейнеру и просмотрим его свойства:
PS> $path = [ADSI]»LDAP://OU=testOU,DC=testdomain,DC=local» PS> $path | Format-List *
Чтобы создать новый объект, набираем:
PS> $user = $path.Create(‘user’, ‘cn= demo’)
В состав Win2k8 входит утилита ADSI Edit, которая упрощает поиск параметров для написания сценариев, а в Win2k8R2 и Win7 (и только в них) доступен набор командлетов AD PowerShell (Active Directory Module for Windows PowerShell), с помощью которого можно:
- создавать, удалять, изменять и читать объекты пользователей, групп, компьютеров, управляемых аккаунтов служб и организационных подразделений;
- управлять свойствами аккаунтов: дата истечения, пароль и т.д.;
- управлять членством в группах, получать список групп, в которые включен аккаунт;
- управлять политикой паролей домена;
- перемещать контроллеры домена между сайтами и получать информацию о КД;
- управлять политикой репликации пароля контроллера домена только для чтения;
- управлять доменами и лесами, устанавливать функциональный уровень домена и леса.
Чтобы установить AD PowerShell в Win7, надо инсталлировать RSAT (Microsoft Remote Server Administration Tools). После чего AD PowerShell можно загрузить прямо из меню «Программы и компоненты» (Turn Windows Features on or off — Remote Server Administration Tools — Role Administration Tools — AD DS and LDS Tools — Active Directory PowerShell snap-in). На сервере Win2k8R2 нужный компонент ставится еще проще:
PS> Add-WindowsFeature -Name «RSAT-AD-PowerShell» –IncludeAllSubFeature
Для загрузки модуля AD PowerShell набираем:
PS> import-module activedirectory
К примеру, получим все КД текущего домена:
PS> Get-ADDomainController -Filter { name -like «*» }
Также появились командлеты для работы с AD от сторонних разработчиков. Очень популярны свободно распространяемые AD PowerShell cmdlets (их еще называют QAD cmdlets), разработанные Quest Software. В этом наборе имена командлетов составлены из стандартной пары «действие-объект». На первой позиции стоят все те же английские глаголы Get-, Set-, New-, Move-, Remove-, Rename- и так далее. На второй — описание объекта с префиксом QAD (-QADUser, -QADComputer, -QADGroup, -QADObject). Получить список доступных QAD командлетов очень просто:
PS> Get-QCommand
Если работаем под обычной учетной записью, подключимся к контроллеру домена в качестве администратора:
PS> $pw = read-host «Enter password» -AsSecureString PS> Сonnect-QADService -service ‘localhost’ -proxy -ConnectionAccount ‘testdomain\administrator’ -ConnectionPassword $pw
Для начала получим список пользователей и затем компьютеров:
PS> Get-QADUser | Get-Member PS> Get-QADComputer
Чтобы узнать информацию по отдельному пользователю и параметру, просто подставляем его в вызов:
PS> Get-QADUser Vasja -Properties ManagedObjects
Теперь просмотрим список пользователей, которые не регистрировались 2 месяца и сохраним вывод в HTML-файл:
PS> $last2months = (Get-Date).AddMonths(-2) PS> Get-QADUser -IncludedProperties LastLogon | where { $_.lastLogon -le $last2months} | Select DisplayName, LastLogon, AccountIsDisabled | ?{-not $_.AccountIsDisabled} | ConvertTo-Html | Out-File c:\report.html
Чтобы в отчет не попали отключенные учетные записи, в команде проконтролировали значение AccountIsDisabled. Знак «?» является алиасом «Where-Object»; специальная переменная «$_», которая часто используется в скриптах PowerShell, указывает на текущий объект.
Стоит отметить, атрибут LastLogon не реплицируется между контроллерами домена, поэтому если в сети их несколько, то это значение следует получить с каждого КД. Получим список КД и затем опросим каждый на предмет LastLogon:
PS> Get-QADComputer -ComputerRole DomainController | foreach { (Get-QADUser -Service $_.Name -SamAccountName username).LastLogon.Value }
А теперь выберем всех пользователей из отдела Sales, проживающих в Москве, и укажем для них новый номер телефона:
PS> Get-QADUser -City Moscow -Department Sales | Set-QADUser -PhoneNumber ‘495-1111111’
Создадим новую доменную учетную запись:
PS> New-QADUser -name ‘user’ -ParentContainer ‘OU=testOU,DC=testdomain,DC=local’ -UserPassword ‘[email protected]’
Чтобы отключить, включить или разблокировать учетную запись, следует использовать командлеты Disable-QADUser, Enable-QADUser и Unlock-QADUser, соответственно. Также просто создавать новые объекты:
PS> New-QADObject -type OrganizationUnit -ParentContainer teststomain.local -Name NewOU
Теперь переместим в созданный контейнер ряд учетных записей:
PS> Get-QADUser -Department Sales | Move-QADObject -To testsdomain.local/Sales
Управление группами выглядит аналогично:
PS> Get-QADGroupMember Scorpio\Managers | where { $_.City -eq ‘Ekaterinburg’} | Add-QADGroupMember Scorpio\Ekaterinburg_Managers
Экспериментируя с PowerShell, можно легко ошибиться, поэтому при изменении объектов AD лучше запустить выполнение с ключом «-whatif» (что если). В этом случае вместо действительного изменения параметров скрипт выведет в консоль все, что он должен сделать.
Профили 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
и сделать в нем необходимые изменения. Не забудьте проверить, разрешен ли политикой выполнения запуск скриптов.
Особенности запуска скриптов в PowerShell
Необходимо упомянуть об особенностях запуска скриптов PowerShell. Данное средство администрирования и автоматизации обладает очень высоким потенциалом и является мощным инструментом, поэтому разработчиками было принято решение ограничить запуск скриптов по умолчанию. Существует 4-е основных политики безопасности, регулирующих запуск скриптов на целевом устройстве. Вы можете ознакомиться с ними на данном слайде. У каждой политики свои особенности, и они применимы для разных сценариев. В нашем случае, для практической работы мы разрешим выполнение неподписанных скриптов используя политику «unrestricted»
Работа с объектами 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 рассчитан не только на локальное использование, но и на удаленное выполнение команд. Данная возможность необходима, чтобы Вы могли со своего рабочего места управлять удаленными компьютерами, т.е. выполнять команды PowerShell.
Существует несколько способов удаленного управления:
- С помощью параметра –ComputerName (есть у многих команд). Другими словами Вы передаете имя компьютера, на котором необходимо выполнить команду, в качестве параметра. Способ обладает недостатком, так как ограничивается выполнением одной команды;
- С помощью сессий. Командлет Enter-PSSession (интерактивный сеанс). Таким способом Вы подключаетесь к удаленному компьютеру и все команды, которые Вы будете набирать в оболочке PowerShell, будут выполняться на удаленном компьютере так же, как если бы Вы набирали команды непосредственно на удаленном компьютере. Способ также обладает недостатком, так как сеанс ограничивается одним компьютером;
- С помощью командлета Invoke-Command. С помощью данного способа можно выполнять команды или сценарии как на одном компьютере, так и на нескольких.
Например, чтобы подключиться к удаленному компьютеру (в примере ниже ServerName) интерактивным сеансом выполните следующую команду:
1 | Enter-PSSession ServerName |
INFO
PowerShell — это расширяемая оболочка с интерфейсом командной строки и сопутствующий язык сценариев. Упрощает выполнение часто используемых задач, позволяет сократить время администрирования рабочих станций и серверов, а также обеспечивает возможность тонкой настройки компонентов ОС Windows.
Сегодня PowerShell является частью ОС Win2k8R2 и Win7 и встроен в графические консоли администрирования последних продуктов Microsoft (например, Exchange 2007 и System Center 2007).
Интерфейс программирования приложений ADSI предназначен для доступа к службе Active Directory и позволяет создавать, изменять и удалять объекты в каталогах, выполнять поиск и множество других операций.
При использовании QAD команды для работы с AD выглядят на порядок проще, а скрипты читабельнее.
QAD командлеты понадобятся в случае использования некоторых GUI к PowerShell, в которых имеется функция для работы с Active Directory (например, PowerGUI).
Производители программного обеспечения не остаются в стороне и разрабатывают большое количество командлетов.