Windows PowerShell
Скачать 0.93 Mb.
|
A11 get-service | sort-object status | convertto-html name, status > .\a10.html B1 get-childitem * -exclude *.tmp | select-object name, length B2 get-childitem * -exclude *.tmp | select-object name, length | sort-object length, name B3 get-childitem | get-member B4 get-childitem | group-object extension | sort-object count B5 (get-childitem .\*.tmp | measure-object length -sum).sum B6 remove-item .\*.tmp B7 get-childitem | where-object {$_.length -gt 2000000} | foreach-object {remove-item $_.fullname} B8 get-childitem | select-object extension | sort-object extension -unique | foreach-object {new-item (".\New" + $_.extension) -type directory} B9 get-childitem | where-object {$_.mode -notmatch "d"} | foreach-object {$b= ".\New" + $_.extension; move-item $_.fullname $b} B10 get-childitem -recurse > .\finaloutput.txt B11 get-childitem *.doc | foreach-object {$_.Isreadonly = 0} C1 $p | measure-object CPU -min -max -average C2 $p | sort-object CPU -Descending | Select-Object -first 5 D1 (get-wmiobject -class win32_computersystem).username D2 $a = new-object -comobject excel.application $a.Visible = $True $b = $a.Workbooks.Add() $c = $b.Worksheets.Item(1) $c.Cells.Item(1,1) = "Service Name" $c.Cells.Item(1,2) = "Service Status" $i = 2 get-service | foreach-object{ $c.cells.item($i,1) = $_.name $c.cells.item($i,2) = $_.status; $i=$i+1} $b.SaveAs("C:\Users\frankoch\Downloads\Test.xls") $a.Quit() E1 get-eventlog "Windows PowerShell" | group-object eventid | sort-object name get-eventlog "Windows PowerShell" | where-object {$_.eventid -eq 403} E2 get-eventlog system -newest 15 | sort-object eventid -descending ПРИЛОЖЕНИЕ ПРИМЕРЫ СЦЕНАРИЕВ Примеры к Windows PowerShell – от простых к сложным Вы можете просто скопировать следующие сценарии и запустить их в Windows PowerShell. Они демонстрируют теоретические возможности PowerShell, а также то, что краткое введение не в состоянии описать все возможности Windows PowerShell. Чтобы скопировать сценарии, выделите текстовые строки сразу после первого символа «>» до комментариев (не включая комментарии). Эти упражнения в основном взяты из горячо рекомендуемой книги «Windows PowerShell in Action» Брюса Пайетта, создателя Windows PowerShell. В этой книге примеры снабжены очень подробными пояснениями, на случай если вам потребуется дополнительная информация. Пример 1: Прямой вывод строки Самая короткая программа "Hello world": "Hello world" Комментарии: Windows PowerShell может непосредственно распознавать введенную строку и выводить ее на экран. Пример 2: Анализ файла журнала Создает список всех файлов журналов в папке «Windir»; находит файлы, содержащие слово «Error», выводит имя файла журнала и строку с ошибкой: dir $env:windir\*.log | Select-String -List error | Format-Table path,linenumber -Autosize Комментарии: Может возникнуть сообщение об ошибке, связанной с недостатком полномочий и т.д. Игнорируйте подобные сообщения. Пример 3: Ваша программа для чтения RSS Вызывает веб-страницу, читает ленту RSS, выводит сообщения из ленты RSS и их URL-адреса: ([xml](New-Object net.webclient).DownloadString( "http://blogs.msdn.com/powershell/rss.aspx")).rss.channel.item | Format-Table title,link Комментарии: В самом начале соединение с веб-сайтом может устанавливаться достаточно медленно. Пример 4: Добавление окон в сценарий Создает отдельную форму WinForm для графического вывода информации: [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms") $form = New-Object Windows.Forms.Form $form.Text = "My First Form" $button = New-Object Windows.Forms.Button $button.text="Push Me!" $button.Dock="fill" $button.add_click({$form.close()}) $form.controls.add($button) $form.Add_Shown({$form.Activate()}) $form.ShowDialog() Комментарии: Для завершения просто щелкните по новому окну (может находиться за окном Windows PowerShell). ПРИЛОЖЕНИЕ ТЕОРИЯ WINDOWS POWERSHELL Теоретические принципы Windows PowerShell Windows PowerShell – краткое введение Предыдущие попытки Microsoft по созданию оболочек командной строки были не слишком успешны. Старый command.com, вероятно, соответствовал уровню первых версий MS DOS, но растущее число функций операционной системы вскоре превысило его возможности. Оболочка cmd.exe, появившаяся в Windows NT, предоставляла пользователям дополнительные средства. Но по сравнению с популярными оболочками Unix, такими как Bash, командная строка Microsoft, несомненно, имела множество недостатков. Теперь Microsoft полностью изменила ситуацию. Создавая Windows PowerShell (ранее называлась Monad Shell, MSH), разработчики средств администрирования хотели дать нам оболочку для Windows, которую можно будет использовать для написания любых сценариев для управления системой. Windows PowerShell следует совершенно новой концепции, в отличии от тексто-ориентированных оболочек, таких как bash. Цели разработки Windows PowerShell Windows PowerShell – это новая оболочка командной строки Windows, разработанная специально для системных администраторов. Эта оболочка содержит интерактивную командную строку и среду сценариев, которые можно использовать как по одиночке, так и вместе. В противоположность большинству оболочек командной строки, которые принимают и возвращают текст, Windows PowerShell базируется на объектной модели, появившейся в .NET Framework 2.0. Это фундаментальное отличие в среде позволяет использовать для управления и настройки Windows совершенно новые инструменты и методики. Windows PowerShell вводит идею командлетов (пишется «cmdlet»). Командлет – это простой инструмент командной строки, интегрированный в оболочку и выполняющий единственную функцию. Хотя вы можете использовать командлеты поодиночке, их мощь становится более очевидной при использовании комбинаций командлетов для выполнения сложных задач. Windows PowerShell содержит несколько сотен базовых командлетов, а также дает возможность создавать собственные командлеты и сценарии и передавать их другим пользователям. Как многие другие командные оболочки, Windows PowerShell дает вам доступ к файловой системе компьютера. Благодаря поставщикам Windows PowerShell вы получаете легкий доступ к другим хранилищам данных, таким как реестр и хранилища сертификатов. О тексте, разборе текста и объектах PowerShell полностью объектно-ориентирована. По сравнению с обычными оболочками она работает иначе, результатом выполнения команды будет не текст, а объект (дальше этот момент будет рассмотрен подробнее). Но аналогично более ранним популярным оболочкам, она имеет конвейер, в который передаются и в котором обрабатываются результаты отдельных команд. Единственная разница состоит в том, что исходные и промежуточные значения и результаты являются объектами, а не текстом. Объекты PowerShell не отличаются от объектов в программах C++ или C#. Вы можете представить объект как блок данных с атрибутами и методами. Методы представляют собой действия, которые можно совершить с объектом. Если, например, вы обращаетесь к службе из Windows PowerShell, вы на самом деле используете объект, соответствующий этой службе. Если вы выводите на экран информацию о службе, вы выводите атрибуты соответствующего объекта службы. И если вы запускаете службу, то есть меняете атрибут статуса службы на «запущен», вы используете метод объекта службы. По мере увеличения опыта вы лучше поймете преимущества обработки объектов и будете работать с объектами осознанно. Объектно-ориентированная концепция PowerShell делает стандартный разбор текста командных оболочек Unix (анализ/оценка) и текстовую информацию со всеми ее проблемами и склонностью к ошибкам, полностью излишними. Чтобы пояснить это, рассмотрим следующий пример: Предположим, вы хотите получить список всех процессов, которые расходуют более 100 дескрипторов. В традиционной командной оболочке Linux мы должны вызвать команду для просмотра процессов (ps -A). Эта команда возвращает текстовый список. Каждая строка будет содержать сведения о процессе, разделенные пробелами. Вы должны разобрать эти строки с помощью отдельного инструмента, отфильтровать коды ID процессов, после чего с помощью другой программы запросить число используемых процессом дескрипторов. Затем вы должны разобрать полученный в виде текста результат, отфильтровать нужные строки и вывести на экран соответствующий текст. В зависимости от того, насколько хорошо вы обрезаете и фильтруете информацию из текста, выдаваемого функциями, этот подход заслуживает доверия в большей или меньшей степени. Однако, например, если заголовок столбца в выходных данных изменился, и имена процессов стали слишком длинными, у вас несомненно возникнут проблемы. PowerShell использует принципиально другой подход. Вы также начинаете с команды get-process, которая возвращает все запущенные процессы в операционной системе. Только в этом случае вы получаете список объектов, состоящий из объектов процессов. Эти объекты можно исследовать на предмет их атрибутов и запросить значения прямо у них – таким образом, вам не нужно исследовать текстовые строки и разделять их на столбцы. Мы еще поговорим об этом более подробно. Новый язык сценариев В Windows PowerShell не используется какой-либо существующий язык, для нее был создан собственный. Причины этого таковы: • . Windows PowerShell необходим язык для управления объектами .NET. • . Язык должен поддерживать сложные задачи, не делая простые задачи сложными. • . Язык должен соответствовать соглашениям других языков, используемых для программирования в .NET, таким как C#. В настоящее время каждый язык имеет свои собственные команды. В Windows PowerShell мы обеспечили соответствие всех команд определенной логике с точки зрения конструкций и наименования. Командлет представляет собой специализированную команду, которая работает с объектами в Windows PowerShell. Вы можете узнать командлеты по их именам: глагол и существительное, всегда в единственном числе, разделенные значком тире (-), например, get-help, get-process и start-service. В Windows PowerShell большинство командлетов очень просты и созданы для использования совместно с другими командлетами. Так, например, командлеты «Get» только извлекают данные, командлеты «Set» создают или изменяют данные, командлеты «Format» форматируют данные, а командлеты «Out» пересылают выводимые данные в указанное место. Команды Windows и служебные программы Вы привыкли использовать определенные команды. Новый язык, который не принимает во внимание этот факт, обречен на быстрое забвение. Поэтому в Windows PowerShell вы можете использовать стандартные команды Windows и запускать программы Windows, имеющие графический интерфейс, например Блокнот (Notepad) и Калькулятор (Calculator). Кроме того, как и в Cmd.exe, вы можете получать текстовый вывод из других программ и использовать этот текст в командной оболочке. Даже если команды, такие как dir, ls или cd, не следуют официальному синтаксису Windows PowerShell, они будут работать и могут использоваться без каких-либо проблем. Интерактивная среда Как и в других командных оболочках, в Windows PowerShell поддерживается полностью интерактивная среда. Если вы в ответ на приглашение вводите команду, она выполняется и результат выводится в окно командной оболочки. Вы можете пересылать результат работы команды в файл или на принтер, а также использовать оператор конвейера (|) для передачи его другой команде. Поддержка сценариев Если вы уже повторяли одни и те же команды, мы рекомендуем не вводить команды или последовательность команд по отдельности, а сохранить их в файле и выполнять этот файл. Файл, содержащий команды, называется сценарием. Аналогично поддержке интерактивных интерфейсов, Windows PowerShell обеспечивает полную поддержку сценариев. Вы можете запустить сценарий, введя его имя в строке приглашения. Расширение файлов сценариев Windows PowerShell scripts - .ps1; вводить расширение файла необязательно. Хотя сценарии используются очень часто, они также могут быть использованы для распространения вредоносного кода. Поэтому вы можете определить в Windows PowerShell политики безопасности (также называемые политиками выполнения), чтобы указать, какие сценарии могут запускаться, и должны ли они иметь цифровую подпись. Чтобы избежать ненужного риска, ни в каких политиках выполнения Windows PowerShell не разрешается выполнять сценарии двойным щелчком на их значках, что можно делать, например, со старыми файлами .bat, .cmd или.vbs. CMD, WScript или PowerShell? Что выбрать? Для Windows XP имеется три оболочки языков сценариев: старая добрая оболочка CMD, Windows Scripting Host для ваших сценариев VB или Jscript, а теперь и Windows PowerShell. Но не бойтесь, вам не нужно выбирать между оболочками или беспокоиться о том, что одна из них устареет. Даже в новых версиях Windows, таких как Vista или Longhorn Server, вы обнаружите, что все три оболочки остались равноправными. Вы можете использовать ту из них, которую предпочитаете, на ваш вкус. Вы также можете использовать оболочку, которая наилучшим образом подходит для конкретной задачи. Если вы до сих пор написали немного сценариев, сейчас самое время начать работать с Windows PowerShell, чтобы иметь под рукой новейшую и самую простую в использовании технологию. Решая практические задачи, которые у вас есть или будут, вы увидите, как это просто и какими мощными могут быть простые сценарии, не перерывая гигантские тома и книги из 60-х и 70-х годов о программировании командных файлов. Windows PowerShell 1.0 Хотя Windows PowerShell имеет версию 1.0, качество продукта весьма впечатляет, и я могу с чистой совестью рекомендовать его использование в практической работе. В основном это вызвано тем, что Windows PowerShell на самом деле является действительно новым способом использования популярной среды .NET Framework 2.0. Однако вам следует учитывать небольшой номер версии продукта. Уже набор функций должен сказать вам, что не все, необходимое вам, уже имеется в Windows PowerShell. Windows PowerShell сейчас может обеспечить прямой доступ к файловым системам, журналам сообщений, записям реестра, интерфейсам и объектам .NET, WMI и ADSI; однако удаленная работа в нем еще не реализована. Это означает, что доступ к другим компьютерам работает с помощью средств WMI или .NET. В будущем мы сможем, вероятно, использовать для администрирования новые интерфейсы веб-служб, которые были сертифицированы в 2006 году. Сейчас следует удовлетвориться использованием существующих проверенных методов, таких как WMI и .NET. ПРИЛОЖЕНИЕ СЦЕНАРИИ И БЕЗОПАСНОСТЬ Безопасность при использовании сценариев Со службой Windows Scripting Host (WSH), введенной в Windows 2000, Microsoft заявила о создании новой мощной системы сценариев. Эта система была настолько мощной, что была использована вирусописателями в качестве новой арены. Неопытные пользователи получали несколько первых электронных писем с многообещающими привлекательными картинками, но когда они открывали вложение, там было не на что смотреть, они оборачивались сценариями VBScript, которые приступали к взлому системы. Windows PowerShell делает все возможное, чтобы противостоять этому типу угроз. Так, базовые настройки Windows PowerShell предполагают запрет запуска любых сценариев. Эта функция должна быть явным образом активирована системным администратором. Активация обеспечивает различные уровни безопасности, которые используют подписание сценариев. Кроме того, расширение файлов Windows PowerShell (PS1) ассоциировано с блокнотом (Notepad). Даже если ваша среда допускает выполнение сценариев, все неблагоразумные двойные щелчки по почтовым вложениям или файлам будут просто приводить к запуску Блокнота и демонстрации исходного кода. И наконец, Windows PowerShell всегда требует явного ввода полного пути для файлов, которые которые не находятся в папках обозначенных в переменной окружения %Path%. Это может предотвратить случайное выполнение программы, которую вы не хотели использовать, в Windows PowerShell. Чтобы быть в состоянии запустить сценарий, вам следует изменить настройки безопасности для Windows PowerShell. Для этой цели используются два командлета: get- executionpolicy и set-executionpolicy. С помощью get-executionpolicy вы получаете существующие настройки. Существует четыре уровня безопасности: Значение политики Описание Restricted (Запрещено, по умолчанию) Сценарии не запускаются Allsigned (Все подписанные) Запускаются только подписанные сценарии RemoteSigned (Удаленные подписанные) Разрешен запуск локальных сценариев, прочие сценарии должны быть подписаны Unrestricted (Без ограничений) Запускаются все сценарии Для изменения этих настроек системный администратор должен вызвать, например, команду set-executionpolicy remotesigned Microsoft предоставляют шаблон групповой политики, чтобы автоматически устанавливать ключ в больших организациях. Дополнительные сведения по этой теме можно найти в документации по Windows PowerShell. ЗАКЛЮЧЕНИЕ Я хочу поблагодарить свою жену Петру за ее любовь и участие. Она отказалась от множества воскресных поездок и вечеров со мной, когда я проводил время без нее, со своим компьютером. Эта книга не была бы написана без разработчиков Windows PowerShell,и я искренне благодарен им. Особые благодарности я, разумеется, выражаю Брюсу Пайетту, который дал мне начальный импульс своей книгой «Windows PowerShell in Action». Очень рекомендую прочесть ее! Не все части этой книги я писал сам, в частности, теоретические разделы взяты из содержимого, опубликованного в Microsoft MSDN или файла справки Windows PowerShell. Там вы найдете больше полезной информации, которую я рекомендую вам прочитать. Если у вас имеются комментарии или советы по этой книге, напишите мне по электронной почте. Я могу быть не в состоянии ответить каждому лично, но буду очень признателен за любую конструктивную критику и похвалы: frankoch@microsoft.com PowerShell – краткая шпаргалка Отдельные команды Для справки по любому коммандлету используйте get-help Get-Help Get-Service Чтобы получить список доступных коммандлетов, используйте get-command Get-Command Чтобы получить список всех свойств и методов объекта, используйте get-member Get-Service | Get-Member Установка политики безопасности Просмотр и изменение политики безопасности с помощью Get-ExecutionPolicy и Set- ExecutionPolicy Get-Executionpolicy Set-Executionpolicy remotesigned Выполнение сценария powershell.exe –noexit &"c:\myscript.ps1" Функции Параметры разделяются пробелами. Return необязателен. function sum ([int]$a,[int]$b) { return $a + $b } sum 4 5 Переменные Должны начинаться с $ $a = 32 Могут иметь тип [int]$a = 32 Массивы Инициализация: $a = 1,2,4,8 Запрос элемента: $b = $a[3] Константы Создаются без $ Set-Variable –name b –value 3.142 –option constant Используются с $ $b Создание объектов Создание экземпляра объекта COM New-Object -comobject $a = New-Object –comobject "wscript.network" $a.username Создание экземпляра объекта .Net Framework. При необходимости могут передаваться параметры New-Object –type <.Net Object> $d = New-Object -Type System.DateTime 2006,12,25 $d.get_DayOfWeek() Запись в консоль Имя переменной $a или Write-Host $a -foregroundcolor "green" Пользовательский ввод Для получения ввода от пользователя используйте Read-Host $a = Read-Host "Enter your name" Write-Host "Hello" $a Передача аргументов командной строки Передаются в сценарий, разделяясь пробелами myscript.ps1 server1 benp Получаются в сценарии в массив $args $servername = $args[0] $username = $args[1] Разное Перенос строки ` Get-Process | Select-Object ` name, ID Комментарии # # код отсюда не исполняется Объединение строк ; $a=1;$b=3;$c=9 Передача выходных данных по каналу другой команде | Get-Service | Get-Member Цикл For Повторяет одинаковые шаги определенное количество раз For ($a=1; $a –le 10; $a++) {$a} Цикл ForEach Цикл по коллекции объектов Foreach ($i in Get-Childitem c:\windows) {$i.name; $i.creationtime} Цикл Do While Повторяет набор команд, пока выполняется условие $a=1 Do {$a; $a++} While ($a –lt 10) Цикл Do Until Повторяет набор команд до выполнения условия $a=1 Do {$a; $a++} Until ($a -gt 10) Оператор If В зависимости от заданного условия выполняет тот или иной участок кода $a = "white" if ($a -eq "red") {"The colour is red"} elseif ($a -eq "white") {"The colour is white"} else {"Another colour"} Оператор Switch Другой способ выполнять определенный участок кода в зависимости от заданных условий $a = "red" switch ($a) { "red" {"The colour is red"} "white"{"The colour is white"} default{"Another colour"} } Запись в простой файл Для простого текстового файла используйте Out-File или > $a = "Hello world" $a | out-file test.txt Или используйте > для вывода результатов работы сценария в простой текстовый файл .\test.ps1 > test.txt Чтение из файла Используйте Get-Content для создания массива строк. Затем выполните цикл по массиву $a = Get-Content "c:\servers.txt" foreach ($i in $a) {$i} Запись в файл HTML Используйте ConvertTo-Html и > $a = Get-Process $a | Convertto-Html -property Name,Path,Company > test.htm Запись в файл CSV Используйте Export-Csv и Select-Object для фильтрации выводимых данных $a = Get-Process $a| Select-Object Name,Path,Company | Export-Csv -path test.csv |