Windows PowerShell: мощный инструментарий для выполнения административных задач
Ульяна Смелая (core@synack.ru)
Долгое время визитной карточкой Windows служил графический интерфейс, а желающим поработать в консоли приходилось довольствоваться весьма урезанным функционально cmd.exe. Появление PowerShell с гибким языком сценариев изменило ситуацию к лучшему. Используя его возможности, можно легко выполнить практически любую задачу, возникающую перед администратором.
СОДЕРЖАНИЕ:
- Зачем админу PowerShell?
- Начинаем исследование
- Работаем с WMI-объектами
- Работаем с Active Directory
- Заключение
- Мини-статья: Новое в PowerShell 2.0
- Врезка: Ракушка? Скорлупа? Гильза? Командная оболочка!
- Врезка: Полезные мелочи
- Врезка: В чем работать с PowerShell?
- Боковые выносы
Если настройку при помощи графических утилит можно назвать наглядной, то консоль вырывается вперед, когда говорят об автоматизации задач и обработке большого количества данных. Ранее админу, чтобы упростить себе работу, необходимо было использовать командные BAT-файлы, VBScript, JavaScript, Windows Script Host, Perl и прочие инструменты, позволяющие управлять системной информацией. Но одни из них ограничены по возможностям, другие сложны и неудобны, применение третьих (VBScript/JavaScript) может снизить общий уровень безопасности системы. PowerShell (ранее Monad), вышедший в 2006 году, лишен этих недостатков, он изначально объектно-ориентирован, вобрал в себя лучшие элементы из Perl, PHP, C# и использует все современные наработки Microsoft (в первую очередь .NET Framework, объектами которой оперирует совершенно свободно). Результат работы не нужно парсить, чтобы понять, что получилось, его опять можно обработать без какой-либо дополнительной подготовки. Именно поэтому принцип использования PowerShell несколько отличается от привычных юниксовых интерпретаторов. В оболочку встроено свыше 130 команд, позволяющих получить доступ к любому объекту файловой системы, реестра, сети, Active Directory, а используя предпочитаемый .NET язык, можно создавать дополнительные команды. Именно наличие большого количества командлетов (cmdlets) — командных модулей, своего рода готовых мини-программ, реализующих отдельные операции, заметно упрощает выполнение часто используемых задач.
Сейчас PowerShell встроен в Win2k8/R2/Se7en и доступен как опциональный компонент для WinXPSP2/2k3/Vista. На момент написания этих строк актуальными были версии PowerShell 1.0 и 2.0 CTP3 (Community Technology Preview 3), которую и будем использовать, так как до финального релиза уже рукой подать. Скачать CTP3 можно свободно с сайта , для установки потребуется .NET (нужен для всех версий PowerShell) и .NET (для работы ISE — Integrated Scripting Environment), для удаленного управления понадобится . Все эти компоненты ты найдешь на прилагаемом к журналу DVD диске.
На первый взгляд синтаксис командной оболочки кажется немного запутанным, но в действительности все понятно и логично. Все названия командлетов стандартизированы, имена выглядят как «действие-объект». Так чтобы получить данные объекта, используем действие «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 cоздан репозитарий командлетов , который является неким аналогом Perl CPAN. Здесь можно найти решения практически на все случаи. Например, нужен сниффер на PowerShell? Нет ничего проще! Качаем с сайта файл Get-Packet.ps1 и запускаем:
PS> Get-Packet.ps1 -Statistics
Все параметры описаны внутри файла.
Другой командлет позволит получить детальную статистику по пакетам.
По умолчанию выполнение сценариев в PowerShell запрещено, поэтому не все команды удастся запустить. Просмотреть текущий статус политики выполнения можно командой:
PS> Get-ExecutionPolicy AllSigned
Существует четыре типа политики:
- Restricted — возможно выполнение отдельных команд, сценарии запрещены;
- AllSigned — разрешено выполнение подписанных сценариев, перед запуском запрашивается подтверждение;
- RemoteSigned – похож на предыдущий, не запрашивается выполнение сценариев, подписанных надежным издателем, не требуется подпись для локальных сценариев;
- Unrestricted – можно запускать неподписанные сценарии.
PS> Set-ExecutionPolicy RemoteSigned
Доступ в скриптах PowerShell к инструментарию управления Windows (WMI, Windows Management Instrumentation) дает почти безграничные возможности: можно получать, устанавливать, контролировать практически любые системные параметры. Для работы с WMI в PowerShell используется командлет Get-WmiObject. Чтобы узнать все допустимые параметры, запускаем его со знаком вопроса. Команда «Get-WmiObject -List» выведет список всех доступных WMI-объектов (приготовься, он будет большим), аналогично, добавив «-List» при вызове определенного класса, увидим все возможные методы и свойства. Например, просмотрим список всех классов, связанных с сетевыми настройками:
PS> Get-WmiObject -List | where {$_.name -match "net"}
И запросим настройки сетевых адаптеров:
PS> Get-WmiObject -Class Win32_NetworkAdapterConfiguration \ -Filter IPEnabled=TRUE
В результате получим таблицу с полной конфигурацией. Чтобы сохранить ее в файл, достаточно использовать стандартную функцию перенаправления, т.е. просто добавить в конец команды «> network.txt». Кроме того, есть возможность сразу отформатировать вывод (Get-Help Export). При вызове директиву «-Class» можно опустить. Также надо помнить о клавише <Tab>, если ее нажать при вводе параметров, станет доступен список возможных вариантов, иначе показываются все файлы текущего каталога.
В скриптах часто нужен только один параметр из вызова, поэтому сократим вывод, выбрав при помощи Select-Object только один пункт, например IP-адрес:
PS> Get-WmiObject Win32_NetworkAdapterConfiguration \
-Filter IPEnabled=TRUE | Select-Object -Property IPAddress
IPAddress
---------
{192.168.1.58}
{192.168.159.1}
По умолчанию идет опрос локальной системы, но командлет Get-WmiObject принимает параметр «-ComputerName«, который используется, чтобы создать запрос к WMI другой системы, находящейся в локальной сети. Точка после параметра (-ComputerName .) указывает на текущую машину. Например, произведем опрос свободного места на дисках в двух системах, результат сохраним в файл формата CSV:
PS> $machines = @("comp1", "comp1")
PS> $(foreach ($machine in $machines)
{
Get-WmiObject Win32_LogicalDisk -ComputerName $machine | \
Select-Object -Property FreeSpace | Export-CSV c:\disks.csv
})
После ввода последней директивы нажимаем <Enter> дважды. Данные будут выведены в байтах, что не очень наглядно, но их легко перевести, например, в гигабайты:
PS> Get-WmiObject win32_logicaldisk | Select-Object \
-Property FreeSpace | % {$_.freespace/1GB }
Теперь запросим список расшаренных сетевых папок:
PS> Get-WmiObject Win32_Share Name Path Description ---- ---- ----------- С$ С:\ Стандартный общий ресурс IPC$ Удаленный IPC
Сегодня проблемой в организациях является несанкционированное использование USB-устройств, и здесь нам может помочь PowerShell:
PS> Get-WmiObject Win32_USBControllerDevice | Format-List \ Antecedent, Dependent
Используя Where/Where-Object, StatusCode, IF и другие операторы, можно отобрать только те параметры, которые удовлетворяют определенным условиям. Проверяем, жив ли компьютер в сети, если да, получаем список процессов, иначе выводим сообщение:
PS> $computer = 192.168.1.1
PS> $ping = Get-WmiObject Win32_PingStatus -filter \
"Address='$computer'"
// статус "0" означает нормальное завершение
PS> if ($ping.StatusCode -eq 0)
{
Get-Service
}
else
{
Add-Content "$computer is not available"
Используя командлеты, можно выполнять все операции с 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, надо инсталлировать (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), разработанные . В этом наборе имена командлетов составлены из стандартной пары «действие-объект». На первой позиции стоят все те же английские глаголы 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 'P@ssword'
Чтобы отключить, включить или разблокировать учетную запись, следует использовать командлеты 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, и наличие огромного числа готовых командлетов, стоит потратить некоторое время на ее изучение. Можешь быть уверен, это окупится с лихвой за счет автоматизации рутинных операций.
Мини-статья: Новое в PowerShell 2.0
PowerShell v2 используется по умолчанию в Win2k8R2 и Win7. По сравнению с версией 1.0, оболочка получила 24 новых командлета и имеет ряд усовершенствований, о которых хотелось бы сказать отдельно (все они доступны в CTP3):
- Удаленное выполнение команд (PowerShell Remoting) — используя технологию WinRM, PowerShell может выполнять команды сразу на нескольких системах и отслеживать результат (Get-Help About_Remoting);
- Выполнение в фоне (Background Jobs) – возможность выполнять команды и скрипты в фоне (Get-Help About_PSJob);
- Новый API, который позволяет встраивать PowerShell в другие продукты;
- Новые переменные — пополнился набор переменных. Например, $commandLineParameters позволит получить аргументы командной строки;
- Отладчик в консоли – теперь в скриптах, кроме Set-PSDebug, можно использовать еще ряд командлетов, устанавливать точки останова и продолжать отладку в пошаговом режиме (Get-Help about_debugger);
- Многочисленные улучшения в работе с WMI;
- Script Internationalization — новая функция, позволяющая создать скрипт, который затем можно легко перевести на другой язык (Get-Help about_Script_Internationalization);
- Новые операторы (@), -Join, -Split, упрощающие работы с текстовыми строками;
- ScriptCmdlets – возможность создания командлетов только с использованием кода PowerShell, без применения C# или Visual Basic .Net;
- Командлет Out-GridView позволяет выводить данные в виде таблицы (Get-Help Out-GridView);
- PowerShell Integrated Scripting Environment – графическая оболочка.
Врезка: Ракушка? Скорлупа? Гильза? Командная оболочка!
PowerShell — это расширяемая оболочка с интерфейсом командной строки и сопутствующий язык сценариев. Упрощает выполнение часто используемых задач, позволяет сократить время администрирования рабочих станций и серверов, а также обеспечивает возможность тонкой настройки компонентов ОС Windows.
Если приходится часто вводить одинаковые команды, воспользуйся алиасами. Для начала взглянем на список предустановленных псевдонимов:
PS> get-alias
Например, вместо «Get-Process» можно ввести просто «gps». Задать свой алиас очень просто:
PS> Set-Alias d Get-Date
Теперь чтобы вывести дату, достаточно набрать «d».
Если в скриптах некоторый код повторяется несколько раз, имеет смысл использовать функции:
function <имя> {<код>}
Очень удобно, что все функции, объявленные во время текущего сеанса консоли, запоминаются, и к ним можно обращаться по мере необходимости.
Командная строка (хост) PowerShell.exe имеет простой интерфейс, и несколько неудобна при повседневном использовании и тестировании скриптов. При постоянной работе лучше подыскать альтернативные решения, благо их сегодня предостаточно. Например, бесплатный для некоммерческого использования или . Хост , основанный на графической подсистеме WPF (Windows Presentation Foundation), обладает интересным режимом QuakeMode (Get-QuakeMode), эмулирующим вид консоли популярной игры. Очень удобен редактор , созданный нашими соотечественниками, с автоматическим дополнением команд, хорошим отладчиком, возможностью поиска командлетов в репозитарии PoshCode Cmdlets и многими другими функциями. Поклонники FAR наверняка оценят наличие плагина для этого файлового менеджера — .
INFO
-
Сегодня PowerShell является частью ОС Win2k8R2 и Win7 и встроен в графические консоли администрирования последних продуктов Microsoft (например, Exchange 2007 и System Center 2007).
-
Интерфейс программирования приложений ADSI предназначен для доступа к службе Active Directory и позволяет создавать, изменять и удалять объекты в каталогах, выполнять поиск и множество других операций.
-
При использовании QAD команды для работы с AD выглядят на порядок проще, а скрипты читабельнее.
-
QAD командлеты понадобятся в случае использования некоторых GUI к PowerShell, в которых имеется функция для работы с Active Directory (например, PowerGUI).
-
Производители программного обеспечения не остаются в стороне, они проявляют к PowerShell огромный интерес и разрабатывают большое количество командлетов.
WWW
-
Еще о PowerShell читай в статьях:
- «»
- «» - Блог, посвященный PowerShell, —
- Веб-страница Windows PowerShell —
-
Страница TechNet «Active Directory Administration with Windows PowerShell» —
- Сообщество PowerShell —
WARNING
-
Некоторые командлеты (Get-WinEvent, Get-Counter, Import-Counter и другие) работают только в новых версиях Windows (от Vista).
Статья опубликована в сентябрьском журнале «Xakep» за 2009 год.





