http://www.xakep.ru/magazine/xa/091/040/5.asp
Naked Snake
Хакер, номер #091, стр. 091-040-5
Ты еще раз убедился, что скрипт написан полностью с использованием cmdlets. Этот код с вызовом функции Get-WmiObject я привел не просто так. WMI — это Windows Management Instrumentation, то есть программный интерфейс управления системой. С помощью WMI возможно управлять операционкой и получать информацию о системе. Например, ты легко можешь получить настройки БИОСа:
gwmi win32_BIOS
SMBIOSBIOSVersion : ASUS A7N8X2.0 ACPI BIOS Rev 10
Manufacturer : Phoenix Technologies, LTD
Name : Phoenix — AwardBIOS v6.00PG
SerialNumber : xxxxxxxxxxx
Version : Nvidia — 42302e31
Маленькое пояснение: gwmi — это короткий псевдоним все той же Get-WmiObject. Штука поистине уникальная: с ее помощью можно узнать о всех девайсах, присоединенных к твоему компу (принтеры, сканеры), сетевых настройках, легко управлять софтом, установленном на машине (так же как в меню «Установка и удаление программ») и многое другое. Смотри, как вывести свободное место на своих дисках:
get-wmiobject Win32_LogicalDisk | select deviceid,freespace,size
deviceid freespace size
——— ——— —-
A:
C: 6861377536 27135164416
D: 1317060608 18867748864
Для этого в качестве параметра для Get-WmiObject мы передали флаг Win32_LogicalDisk и таким образом получили полную статистику по дискам с нужными нам полями. Набери в консоли «Get-WmiObject –list» — и ты подивишься разнообразию объектов, о которых собрана информация. Но едва ли среди этого огромного списка найдешь то, что тебе действительно нужно. Но тут есть простой рецепт — набери в консоли:
get-WMIObject -list | where {$_ -match «что тебя интересует»}
Конструкция, указанная после пайпа (|), — это что-то вроде аналога grep в юниксе. То есть она фильтрует строки по содержимому, и после ввода этой команды ты получишь только те строки, в которых содержится интересующая тебя последовательность символов.
Необычные провайдеры
Перейдем к еще одной новаторской фиче — PowerShell. Ребята из Microsoft подумали и решили максимально упростить работу пользователя с различными структурами: файловой системой, реестром, множеством переменных. Для всех них определены несколько общих методов, позволяющих легко манипулировать данными. Вот пример. Допустим, мы выбрали в качестве структуры (в плоскости PowerShell — провайдера) файловую систему и совершенно обычным образом перемещаемся между папками и дисками с помощью команды cd. Зашли в диск C:\ и просмотрели содержимое с помощью ls. А теперь выберем в качестве структуры реестр. По большому счету, он очень схож с файловой системой: разделы или ветки — это папки, а ключи реестра – это файлы. Так почему бы не перемещаться по ним аналогичным образом? Провайдером по умолчанию, что логично, установлена файловая система (FileSystem). Чтобы сменить провайдера, необходимо использовать команду Set-Location. Список всех доступных вариантов выдаст команда Get-PSProvider:
Name Capabilities Drives
—- ———— ——
Alias ShouldProcess {Alias}
Environment ShouldProcess {Env}
FileSystem Filter, ShouldProcess {C, D, E, F..
Function ShouldProcess {Function}
Registry ShouldProcess {HKLM, HKCU}
Variable ShouldProcess {Variable}
Certificate ShouldProcess {cert}
Скажем, если ты хочешь изучить содержимое реестра, то должен переключиться на него с помощью команды Set-Location HKLM:\. Теперь просмотри список ветки HKLV с помощью ls. Вывод команды отображен на скрине — глянь туда. Теперь ты можешь творить с реестром, что хочешь. Его ветки теперь для тебя, как папки, и ты можешь бродить по ним через «cd». А значения ключей легко выводятся cat’ом. Это, кстати, одна из самых мощных и полезных фич PowerShell’a.
Это только начало приключений
Признаться, PowerShell настолько многообразный и функциональный, что едва ли я охватил даже тысячную часть всех его возможностей. Но я постарался показать самый сок и основной подход в реализации сценариев. Теперь — дело за тобой. Всевозможные HOWTO и подробная документация доступна в интернете, но пока только на английском языке. Но штуковина стоит того, чтобы с ней разобраться — за ней будущее.
Эти фишки помогут тебе в настройке автоматики
PowerShell предоставляет удобные средства по работе с системными службами. Следующая команда, к примеру, выводит список работающих служб:
get-service | where-object { $_.Status -eq «Running» }
Внимательно изучи ключи командлета set-service. С его помощью легко меняются любые параметры служб, например тип запуска:
set-service <имя_службы> -StartupType Manual
Новый шелл от Microsoft имеет в своем арсенале десятки служебных переменных, использованием которых не стоит пренебрегать. Например, переменная $LASTEXITCODE всегда содержит код завершения последней запущенной программы. Заюзать ее проще простого. Например, команда ping, в случае недоступности удаленного хоста, возвращает в качестве кода завершения единицу, а в случае получения ICMP-ответа (то есть удачного подключения) — ноль. Таким образом, написание простейшего скрипта для мониторинга работоспособности удаленного хоста сводится к одной-единственной конструкции if-else.
Удаленное администрирование
Народные умельцы уже написали клиент-серверный скрипт, позволяющий работать в PowerShell на расстоянии. Разработка доступна на сайте http://mshforfun.blogspot.com/2006/03/powershell-remoting-beta-and-future.html и весит аж 300 Кб. Сейчас расскажу, как его поставить. Выкачивай архив, распаковывай и запускай в PowerShell. Переходи в папку с сервером (PowerShellRemoting\server) и запускай инсталляционный скрипт: ./’install.ps1′. Не забудь одну важную вещь. В новом шелле есть такая фича, как execution policies, которая контролирует режимы запуска скриптов. По умолчанию ни один сценарий у тебя не запустится (это для твоей же безопасности сделали, наученные горьким опытом, Script Host). Чтобы активировать возможность запуска скриптов, необходимо выполнить команду Set-ExecutionPolicy RemoteSigned, устанавливающую разрешающий режим. Подробности по теме описаны в справке: Get-Help about_signing | more. Теперь вернемся к установке. После подтверждения установки, в системе обозначится новая служба PowerShellRemoting — ее необходимо запустить, а также настроить на автоматический запуск. Это делается через «Панель управление -> Администрирование -> Службы». По умолчанию шелл принимает подключения от администратора с локалхоста, а для того, чтобы разрешить доступ другим клиентам, необходимо исправить файл user.xml. Ну а дальше? Дальше надо аналогично установить клиентскую часть и радоваться жизни, подключаясь к удаленному компу: ./’Start-Remotehost.ps1′.