Капитан PowerShell и администрирование будущего. Windows PowerShell: мощный инструментарий для выполнения административных задачУльяна Смелая (core@synack.ru) Долгое время визитной карточкой 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. На момент написания этих строк актуальными были версии PowerShell 1.0 и 2.0 CTP3 (Community Technology Preview 3), которую и будем использовать, так как до финального релиза уже рукой подать. Скачать CTP3 можно с сайта Microsoft (go.microsoft.com/fwlink/?LinkID=131969). Для установки потребуется .NET Framework 2.0 (нужен для всех версий PowerShell, go.microsoft.com/fwlink/?linkid=100351) и .NET Framework 3.5.1 (для работы ISE - Integrated Scripting Environment, go.microsoft.com/fwlink/?linkid=105983). Для удаленного управления понадобится WinRM 2.0 CTP3 (go.microsoft.com/fwlink/?linkid=131971). Все эти компоненты ты найдешь на прилагаемом к журналу DVD. Начинаем исследованиеНа первый взгляд синтаксис командной оболочки кажется немного запутанным, но в действительности все понятно и логично. Названия командлетов стандартизированы, имена выглядят как «действие-объект». Так, чтобы получить данные объекта, используем действие «Get-*», установить «Set-*», остановить – «Stop-*», вывод – «Out-*» и т.д. Список всех доступных команд можно просмотреть, выполнив «Get-Command». Для получения помощи набираем «Get-Help». К примеру, просмотрим список процессов, рассортируем их по использованию процессорного времени в убывающем порядке и выберем 10 самых прожорливых:
Все просто! Попробуем потушить самый жадный до CPU процесс:
Чтобы узнать, какие диски доступны, вводим:
Обрати внимание, что в списке будут присутствовать и ветки реестра HKCU и HKLM, к которым можно обратиться как к обычному диску:
Теперь можно перемещаться по выбранной ветке, просматривать, создавать и удалять объекты. Для PowerShell разработано большое количество командлетов, и если ты не хочешь повторно изобретать колесо, вполне естественно посмотреть на результаты работы других администраторов. Сообществом PowerShell создан репозитарий командлетов PoshCode Cmdlets (powershellcommunity.org/Scripts/tabid/81/Default.aspx), который является неким аналогом Perl CPAN. Здесь можно найти решения практически на все случаи. Например, нужен снифер на PowerShell? Нет ничего проще! Качаем с сайта blog.robbiefoust.com/?p=68 файл Get-Packet.ps1 и запускаем:
Все параметры описаны внутри файла. Другой командлет Analyze-Packet (blog.sapien.com/index.php/2008/08/14/analyze-packet-reloaded) позволит получить детальную статистику по пакетам. По умолчанию выполнение сценариев в PowerShell запрещено, поэтому не все команды удастся запустить. Просмотреть текущий статус политики выполнения можно командой:
Существует четыре типа политики:
Работаем с WMI-объектамиДоступ в скриптах PowerShell к инструментарию управления Windows (WMI, Windows Management Instrumentation) дает почти безграничные возможности: можно получать, устанавливать, контролировать практически любые системные параметры. Для работы с WMI в PowerShell используется командлет Get-WmiObject. Чтобы узнать все допустимые параметры, запускаем его со знаком вопроса. Команда «Get-WmiObject -List» выведет список всех доступных WMI-объектов (приготовься, он будет большим). Аналогично, добавив «-List» при вызове определенного класса, увидим все возможные методы и свойства. Например, просмотрим список всех классов, связанных с сетевыми настройками:
И запросим настройки сетевых адаптеров:
В результате получим таблицу с полной конфигурацией. Чтобы сохранить ее в файл, достаточно использовать стандартную функцию перенаправления, то есть просто добавить в конец команды «> network.txt». Кроме того, есть возможность сразу отформатировать вывод (Get-Help Export). При вызове директиву «-Class» можно опустить. Также надо помнить о клавише <Tab>; если ее нажать при вводе параметров, станет доступен список возможных вариантов. Иначе показываются все файлы текущего каталога. В скриптах часто нужен только один параметр из вызова, поэтому сократим вывод, выбрав при помощи Select-Object один пункт, например IP-адрес:
По умолчанию идет опрос локальной системы, но командлет Get-WmiObject принимает параметр «-ComputerName», который используется, чтобы создать запрос к WMI другой системы, находящейся в локальной сети. Точка после параметра (-ComputerName .) указывает на текущую машину. Например, произведем опрос свободного места на дисках в двух системах, и результат сохраним в файл формата CSV:
После ввода последней директивы нажимаем <Enter> дважды. Данные будут выведены в байтах, что не очень наглядно, но их легко перевести, например, в гигабайты:
Теперь запросим список расшаренных сетевых папок:
Сегодня проблемой в организациях является несанкционированное использование USB-устройств. И здесь нам может помочь PowerShell:
Используя Where/Where-Object, StatusCode, IF и другие операторы, можно отобрать только те параметры, которые удовлетворяют определенным условиям. Проверяем, жив ли компьютер в сети, если да – получаем список процессов; иначе выводим сообщение:
Работаем с Active DirectoryИспользуя командлеты, можно выполнять все операции с Active Directory - создавать, удалять, изменять, просматривать свойства объектов, перемещать, переименовывать и восстанавливать объекты, управлять группами, ролями FSMO, доменами и лесами, настраивать политики и многое другое. Обращение к AD происходит через ADSI путем опроса пространства имен «System.DirectoryServices» .NET Framework (подробнее об этом можно прочитать на страничке msdn.microsoft.com/ru-ru/library/system.directoryservices.aspx). Но при использовании ADSI даже простые команды выглядят довольно пугающе для новичков (я уже не говорю о сложных конструкциях). Для примера зададим путь к контейнеру и просмотрим его свойства:
Чтобы создать новый объект, набираем:
В состав Win2k8 входит утилита ADSI Edit, которая упрощает поиск параметров для написания сценариев, а в Win2k8R2 и Win7 (и только в них) доступен набор командлетов AD PowerShell (Active Directory Module for Windows PowerShell), с помощью которого можно:
Чтобы установить AD PowerShell в Win7, надо инсталлировать RSAT (Microsoft Remote Server Administration Tools, technet.microsoft.com/ru-ru/library/cc730825.aspx). После чего 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 нужный компонент ставится еще проще:
Для загрузки модуля AD PowerShell набираем:
К примеру, получим все КД текущего домена:
Также появились командлеты для работы с AD от сторонних разработчиков. Очень популярны свободно распространяемые AD PowerShell cmdlets (их еще называют QAD cmdlets), разработанные Quest Software (www.quest.com/activeroles-server/arms.aspx). В этом наборе имена командлетов составлены из стандартной пары «действие-объект». На первой позиции стоят все те же английские глаголы Get-, Set-, New-, Move-, Remove-, Rename- и так далее. На второй - описание объекта с префиксом QAD (-QADUser, -QADComputer, -QADGroup, -QADObject). Получить список доступных QAD командлетов очень просто:
Если работаем под обычной учетной записью, подключимся к контроллеру домена в качестве администратора:
Для начала получим список пользователей и затем компьютеров:
Чтобы узнать информацию по отдельному пользователю и параметру, просто подставляем его в вызов:
Теперь просмотрим список пользователей, которые не регистрировались 2 месяца и сохраним вывод в HTML-файл:
Чтобы в отчет не попали отключенные учетные записи, в команде проконтролировали значение AccountIsDisabled. Знак «?» является алиасом «Where-Object»; специальная переменная «$_», которая часто используется в скриптах PowerShell, указывает на текущий объект.
А теперь выберем всех пользователей из отдела Sales, проживающих в Москве, и укажем для них новый номер телефона:
Создадим новую доменную учетную запись:
Чтобы отключить, включить или разблокировать учетную запись, следует использовать командлеты Disable-QADUser, Enable-QADUser и Unlock-QADUser, соответственно. Также просто создавать новые объекты:
Теперь переместим в созданный контейнер ряд учетных записей:
Управление группами выглядит аналогично:
Экспериментируя с PowerShell, можно легко ошибиться, поэтому при изменении объектов AD лучше запустить выполнение с ключом «-whatif» (что если). В этом случае вместо действительного изменения параметров скрипт выведет в консоль все, что он должен сделать. ЗаключениеУчитывая возможности, предоставляемые оболочкой PowerShell, и наличие огромного числа готовых командлетов, стоит потратить время на ее изучение. Это с лихвой окупится за счет автоматизации рутинных операций. Новое в PowerShell 2.0PowerShell v2 используется по умолчанию в Win2k8R2 и Win7. По сравнению с версией 1.0, оболочка получила 24 новых командлета и имеет ряд усовершенствований, о которых хотелось бы сказать отдельно (все они доступны в CTP3):
Полезные мелочиЕсли приходится часто вводить одинаковые команды, воспользуйся алиасами. Для начала взглянем на список предустановленных псевдонимов:
Например, вместо «Get-Process» можно ввести просто «gps». Задать свой алиас очень просто:
Теперь чтобы вывести дату, достаточно набрать «d». Если в скриптах некоторый код повторяется несколько раз, имеет смысл использовать функции:
Очень удобно, что все функции, объявленные во время текущего сеанса консоли, запоминаются, и к ним можно обращаться по мере необходимости. В чем работать с PowerShell?Командная строка (хост) PowerShell.exe имеет простой интерфейс, и несколько неудобна при повседневном использовании и тестировании скриптов. При постоянной работе лучше подыскать альтернативные решения, благо их сегодня предостаточно. Например, бесплатный для некоммерческого использования PowerShell Plus (www.idera.com/Products/PowerShell) или PowerShell Analyzer (www.shelltools.net). Хост PoshConsole (www.codeplex.com/PoshConsole), основанный на графической подсистеме WPF (Windows Presentation Foundation), обладает интересным режимом QuakeMode (Get-QuakeMode), эмулирующим вид консоли популярной игры. Очень удобен редактор PowerGUI (powergui.org), созданный нашими соотечественниками, с автоматическим дополнением команд, хорошим отладчиком, возможностью поиска командлетов в репозитарии PoshCode Cmdlets и многими другими функциями. Поклонники FAR наверняка оценят наличие плагина для этого файлового менеджера - FarNet (code.google.com/p/farnet). INFOPowerShell — это расширяемая оболочка с интерфейсом командной строки и сопутствующий язык сценариев. Упрощает выполнение часто используемых задач, позволяет сократить время администрирования рабочих станций и серверов, а также обеспечивает возможность тонкой настройки компонентов ОС Windows. Сегодня PowerShell является частью ОС Win2k8R2 и Win7 и встроен в графические консоли администрирования последних продуктов Microsoft (например, Exchange 2007 и System Center 2007). Интерфейс программирования приложений ADSI предназначен для доступа к службе Active Directory и позволяет создавать, изменять и удалять объекты в каталогах, выполнять поиск и множество других операций. При использовании QAD команды для работы с AD выглядят на порядок проще, а скрипты читабельнее. QAD командлеты понадобятся в случае использования некоторых GUI к PowerShell, в которых имеется функция для работы с Active Directory (например, PowerGUI). Производители программного обеспечения не остаются в стороне и разрабатывают большое количество командлетов. WWWЕще о PowerShell читай в статьях:
WARNINGНекоторые командлеты (Get-WinEvent, Get-Counter, Import-Counter и другие) работают только в новых версиях Windows (от Vista). |