Содержание статьи
Долгое время визитной карточкой Windows служил графический интерфейс, а
желающим поработать в консоли приходилось довольствоваться весьма урезанным
функционально cmd.exe. Появление PowerShell с гибким языком сценариев
изменило ситуацию к лучшему. Используя его возможности, можно легко выполнить
практически любую задачу, возникающую перед администратором.
Зачем админу 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. Скачать его можно с
сайта Microsoft. Для
установки потребуется .NET Framework 2.0 (нужен для всех версий PowerShell)
и .NET Framework 3.5.1 (для работы ISE - Integrated Scripting Environment). Для
удаленного управления понадобится
WinRM 2.0 CTP3.
Начинаем исследование
На первый взгляд синтаксис командной оболочки кажется немного запутанным, но
в действительности все понятно и логично. Названия командлетов
стандартизированы, имена выглядят как «действие-объект». Так, чтобы получить
данные объекта, используем действие «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
Работаем с WMI-объектами
Доступ в скриптах PowerShell к инструментарию управления Windows (WMI,
Windows Management Instrumentation) дает почти безграничные возможности: можно
получать, устанавливать, контролировать практически любые системные параметры.
Для работы с WMI в PowerShell используется командлет Get-WmiObject. Чтобы
узнать все допустимые параметры, запускаем его со знаком вопроса. Команда «Get-WmiObject
» выведет список всех доступных WMI-объектов (приготовься, он будет
-List
большим). Аналогично, добавив «-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
Используя командлеты, можно выполнять все операции с 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 '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 – графическая оболочка.
Полезные мелочи
Если приходится часто вводить одинаковые команды, воспользуйся алиасами. Для
начала взглянем на список предустановленных псевдонимов:
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.
INFO
PowerShell — это расширяемая оболочка с интерфейсом командной строки и
сопутствующий язык сценариев. Упрощает выполнение часто используемых задач,
позволяет сократить время администрирования рабочих станций и серверов, а также
обеспечивает возможность тонкой настройки компонентов ОС Windows.
Сегодня PowerShell является частью ОС Win2k8R2 и Win7 и встроен в графические
консоли администрирования последних продуктов Microsoft (например, Exchange 2007
и System Center 2007).
Интерфейс программирования приложений ADSI предназначен для доступа к службе
Active Directory и позволяет создавать, изменять и удалять объекты в каталогах,
выполнять поиск и множество других операций.
При использовании QAD команды для работы с AD выглядят на порядок проще, а
скрипты читабельнее.
QAD командлеты понадобятся в случае использования некоторых GUI к PowerShell,
в которых имеется функция для работы с Active Directory (например, PowerGUI).
Производители программного обеспечения не остаются в стороне и разрабатывают
большое количество командлетов.
WWW
Еще о PowerShell читай в статьях:
- «Могучий шелл» –
www.xakep.ru/magazine/xa/091/040/1.asp - «Меняем окна на консоль» –
www.xakep.ru/magazine/xa/101/154/1.asp - Веб-страница Windows PowerShell:
www.microsoft.com/powershell. - Страница TechNet «Active Directory Administration with Windows
PowerShell»:
technet.microsoft.com/en-us/library/dd378937(WS.10).aspx. - Сообщество PowerShell:
www.powershell.com.
WARNING
Некоторые командлеты (Get-WinEvent, Get-Counter, Import-Counter и другие)
работают только в новых версиях Windows (от Vista).