ПРАКТИКУМ ПО СИСТЕМЕ АВТОМАТИЗАЦИИ WINDOWSPOWERSHELL. Практикум содержит 10 заданий для индивидуального выполнения обучающимися в процессе прохождения учебной практики. Каждая работа оформляется в виде файла в формата Microsoft Word с использование Screenshot выполненных заданий. Полученные документы направляются руководителю учебной практики для проверки. Перед выполнением заданий обучающимся предлагается ознакомиться с теоретической частью курса. Теоретическая часть. WindowsPowerShell — расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев. Версия 1.0 выпущена в 2006 году. WindowsPowerShell 2.0 был выпущен в составе Windows 7, Windows 8 и WindowsServer 2008 R2 как неотъемлемый компонент системы. Перед разработчиками стояли следующие основные цели и задачи, которые были успешно решены: применение администрирования; объект); командной строки в качестве основного интерфейса реализация модели ObjectFlow (элементом обмена информации является - переработка существующих команд, утилит и оболочки; - интеграция командной строки, объектов COM, WMI и .NET; работа с произвольными источниками данных в командной строке по принципу файловой системы. Самая важная идея, заложенная в PowerShell, состоит в том, что в командной строке вывод результатов команды представляет собой не текст (в смысле последовательности байтов), а объект (данные вместе со свойственными им методами). В силу этого работать в PowerShell становится проще, чем в традиционных оболочках, так как не нужно выполнять никаких манипуляций по выделению нужной информации из символьного потока. 1 PowerShell одновременно является и оболочкой командной строки (пользователь работает в интерактивном режиме) и средой выполнения сценариев, которые пишутся на специальном языке PowerShell(.PS1). Интерактивный сеанс в PowerShell похож на работу в оболочке Unix-систем: все команды в PowerShell имеют подробную встроенную справку (для большинства команд приводятся примеры их использования), поддерживается функция автоматического завершения названий команд и их параметров при вводе с клавиатуры, для многих команд имеются псевдонимы, аналогичные названиям Unix-утилит (ls, pwd, tee и т.д.). Язык PowerShell несложен для изучения, писать на нем сценарии, обращающиеся к внешним объектам, проще, чем на VBScript или JScript. Отдельное внимание было уделено вопросам безопасности при работе со сценариями (например, запустить сценарий можно только с указанием полного пути к нему, а по умолчанию запуск сценариев PowerShell в системе вообще запрещен). WindowsPowerShell включает множество встроенных команд, имеющих унифицированный интерфейс. Таких, например, как команды для работы с WMI (GetWmiObject). Все команды оболочки обрабатываются одним синтаксическим анализатором, в то время как во многих других оболочках каждому средству соответствует отдельный анализатор. Это значительно облегчает изучение команд. PowerShell позволяет запускать унаследованные VBS-сценарии. 1.1. Основные понятия PowerShell В PowerShell существует несколько важных понятий. Одно из них это командлет (Cmdlet)– команда WindowsPowerShell, предназначенная для работы с объектами и выполняющая определенные функции. Командлеты можно идентифицировать по их именам, которые составлены из глагола и существительного, разделенных дефисом (-), например Get-Help, Get-Process и Start-Service. Большинство командлетов WindowsPowerShell очень просты, и предполагается, что они будут использоваться вместе с другими командлетами. Например, командлеты категории «get» только возвращают данные, командлеты «set» только задают или изменяют значения элементов данных, командлеты «format» только форматируют данные, а командлеты «out» только направляют вывод в указанное место назначения. Хотя взаимодействие с оболочкой WindowsPowerShell осуществляется при помощи ввода команд в виде текста, оболочка WindowsPowerShell основана не на тексте, а на объектах. Выходным элементом любой команды является объект. Объект, полученный на выходе одной команды, можно послать на вход другой команды. В результате оболочка WindowsPowerShell позволяет, с одной стороны, администраторам работать с хорошо знакомым интерфейсом командной строки, с другой, использовать мощный функционал работы с объектами. WindowsPowerShell расширяет концепцию пересылки данных между командами, позволяя пересылать объекты, а не просто текст, что является порой очень полезным. 2 В следующей таблице содержится выборка командлетов (Cmdlet), поставляющихся с PowerShell, с приведением максимально похожих команд из других широко известных оболочек командной строки. Описание pwd Отображает текущий рабочий каталог Меняет текущий каталог Очищает экран Windows PowerShell( Alias) Get-Location gl, pwd Set-Location sl, cd, cd, chdir chdir cls, cls clear cpi, copy copy, cp cd help, man ri, del, erase, rmdir, rd, rm rni, ren man rm, rmdir Clear-Host Copy-Item Get-Help Remove-Item Rename-Item cmd.exe / COMMAND. COM(MSDOS, Windows) cd Bash(Unix, BSD, Linux) Windows PowerShell(Cmdlet) help del, erase, rmdir, rd clear cp ren, rename mi, move, move mv mv Get-ChildItem gci, dir, dir ls ls Write-Output echo, write echo echo Pop-Location popd popd popd Move-Item mv Копирует один или несколько файлов или дерево директорий (в PowerShell также можно копировать объекты других поставщиков данных) Справкапокомандам Удаляет файл/каталог (или другой элемент в поставщиках данных PowerShell). Переименовывает файл/каталог Перемещает файл/каталог в новое местоположение Выводит все файлы/каталоги в текущем каталоге Выводит строки, переменные на стандартный вывод Изменяет текущий каталог на тот, который был 3 Push-Location pushd pushd pushd Set-Variable sv, set set set Get-Content gc, type, type cat find, findstr cat Get-Process gps, ps tlist,task list ps Stop-Process spps, kill tee kill,taskk ill n/a kill Select-String Tee-Object grep tee последним помещѐн в стек Помещает текущий каталог в стек Установка значения переменной/создание переменной Получаетсодержимое файла Выводит строки, подходящие под условие Выводит все запущенные процессы Останавливаетзапуще нныйпроцесс Передаѐт входные данные в файл или переменную, затем передаѐт их дальше по конвейеру Теоретические принципы 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. Это фундаментальное отличие в среде позволяет использовать для 4 управления и настройки 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, которая возвращает все запущенные процессы 5 в операционной системе. Только в этом случае вы получаете список объектов, состоящий из объектов процессов. Эти объекты можно исследовать на предмет их атрибутов и запросить значения прямо у них – таким образом, вам не нужно исследовать текстовые строки и разделять их на столбцы. Мы еще поговорим об этом более подробно. Новый язык сценариев В 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 политики безопасности (также называемые политиками выполнения), чтобы указать, какие сценарии могут запускаться, и должны ли они иметь цифровую 6 подпись. Чтобы избежать ненужного риска, ни в каких политиках выполнения 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). Даже если ваша среда допускает выполнение сценариев, все неблагоразумные двойные щелчки по почтовым вложениям или файлам будут просто приводить к запуску Блокнота и демонстрации исходного кода. И наконец, 7 Windows PowerShell всегда требует явного ввода полного пути для файлов, которые которые не находятся в папках обозначенных в переменной окружения %Path%. Это может предотвратить случайное выполнение программы, которую вы не хотели использовать, в Windows PowerShell. Чтобы быть в состоянии запустить сценарий, вам следует изменить настройки безопасности для Windows PowerShell. Для этой цели используются два командлета: getexecutionpolicy и set-executionpolicy. С помощью getexecutionpolicy вы получаете существующие настройки. Существует четыре уровня безопасности: Значение политики Описание Restricted (Запрещено, по умолчанию) Сценарии не запускаются Allsigned (Все подписанные) Запускаются только подписанные сценарии Для изменения этих настроек системный администратор должен вызвать, например, команду set-executionpolicy remotesigned Microsoft предоставляют шаблон групповой политики, чтобы автоматически устанавливать ключ в больших организациях. 8 Практикум. Задания. 1.1. Задание №1. Запуск среды WindowsPowerShell Запуск среды WindowsPowerShell осуществляется следующим образом Пуск ->Все Программы и выбрать элемент WindowsPowerShell. Другой вариант запуска оболочки – пункт Выполнить в меню Пуск, ввести имя файла PowerShellи нажать кнопку ОК. 1. Выполним первую команду в PowerShell. Для первого знакомства с WindowsPowerShell вполне подойдет команда help. Внимательно изучите выведенную на экран информацию. Исполните из командной строки: HelpGet-Command В результате выполнения этой команды мы получим полное описание команды Get-Command, включая ее назначение, синтаксис, опции и т.п. 2. Выполните команду: Get-Command На экран будет выведен список всех встроенных команд. 3. Просмотрите список всех сервисов, запущенных на вашем компьютере, исполнив команду: Get-Service Команда Get-Service служит для получения списка всех сервисов, запущенных на данном компьютере. 4. Просмотрите список всех процессов, запущенных в настоящий момент на вашемкомпьютере,исполнив команду: Get-Process 5. Для получения информации только об одном процессе в качестве аргумента команды Get-Process задается имя этого процесса. Выполните команду: Get-Processexplorer Из командной строки исполните команду: Get-Process w* На экран должна быть выведена информация обо всех запущенных процессах, начинающихся на символ w. 6. По умолчанию информация выводится в виде таблицы, но на самом деле все команды возвращают объекты. Эти объекты могут быть переданы на вход другим командам с помощью символа «|». Исполнитекоманду: Get-Process i* | format-list 9 Объекты будут отформатированы в виде списка. Теперь список процессов доступен в другом представлении. Для получения подробной информации о различных форматах можно использовать следующую команду: Helpformat* Другие возможные форматы: Get-Process i* | format-wide и Get-Process i* | format-custom 7. Выполняя команды, мы всегда получаем объекты, а у объектов есть свойства. Просмотрите все свойства объекта, полученного при выполнении команды GetProcess используя следующую команду: Get-Process | Get-Member 8. Поскольку на выходе всегда получается объект, можно манипулировать им для выполнения дополнительных операций. Выполните операцию фильтрации, исполнив команду: Get-Process | where {$_.handlecount -gt 400} Выполните операцию сортировки, исполнив команду: Get-Process | where {$_.handlecount -gt 400} | sort-object Handles 9. Произведем сортировку объектов по свойству WS (workingset) и выбор 5 процессов, занимающих больше всего памяти Get-Process | sort-object -property WS –descending| select-object first 5 10. Команда stop-process позволяет остановить запущенный процесс. Запустите Notepad. Выполните команду: Get-process notepad | stop-process Окно Блокнота закроется. Снова запустите Notepad. Такая возможность не всегда является безопасной, поэтому лучше использовать подобные команды с опцией whatif, которая показывает, что произойдет при выполнении той или иной команды, но на самом деле команда не выполняется: Get-Process notepad | stop-process -whatif Кроме того, можно указывать на необходимость подтверждения перед выполнением команды: Get-Process notepad | stop-process -confirm В последнем примере мы получаем описание действий, которые выполняет команда, и можем выбрать, подтверждать ее выполнение или нет. 10 1.2. Задание №2. Работа с файловой системой Разберем основные команды WindowsPowerShell, применяемые для манипуляций с файловой системой: new-item, copy-item, move-item, rename-item и remove-item. 11. Создадим новый подкаталог TextFiles в текущем каталоге: new-itemTextFiles -itemtype directory Еслиопуститьпараметр-itemtype,тоWindowsPowerShell спросит, что мы создаем — файл (file) или каталог (directory). Отметим,чтоукомандыnew-itemестьалиас—ni.В сокращенном виде наша первая команда будет выглядеть так: niTextFiles -itemtype directory 12. Создайте несколько новых файлов в текущем каталоге: psdemo.txt, 1.txt, 2.txt: 13. Скопируем все файлы с расширением *.txt в подкаталог TextFiles, используя команду copy-item (алиасы — cpi, cp, сору): Если применять данную команду в пакетном файле, имеет смысл сделать ее более понятной, указав параметры -path (источник) и -destination (приемник): copy-item -path '.\*.txt' -destination '.\TextFiles' 14. После выполнения команды копирования мы используем команду set-location для перехода в подкаталог TextFiles. set-locationTextFiles 15. С помощью команды rename-item переименовываем файл psdemo.txt в psdemo.bak. При необходимости можно применять опции -path и -newName: rename-item psdemo.txt psdemo.bak 16. После того как файл переименован, переносим его на один уровень вверх, используя команду move-item: move-itempsdemo.bak ..\ 17. Затем применяем команду set-location, а точнее — ее алиасslдля перехода в другой каталог: sl .. 18. Манипуляции с файловой системой мы завершаем удалением всего каталога TextFiles, используя команду remove-item. Поскольку в каталоге TextFiles содержатся файлы, применяется опция -recurse. Если эта опция не указана, WindowsPowerShell запросит подтверждение перед выполнением команды remove-item. remove-itemTextFiles–recurse 11 12 13 14 15 Powershell скрипты Все команды в Powershell как правило используются в форме командлетов. Все командлеты это специализированные классы .NET Framework и .NET Core (используется в PowerShell Core 6 и выше). Задание №3 Запуск Powershell WIN+R: Командлеты — это название команд в Powershell. Каждый командлет реализует заложенную в него функциональность. Как правило наименование командлета состоит из пары: глагол-существительное. Например: Get-Help — получить помощь. Обычно Get используется чтобы получить информация, Set — внести изменение, New — создать новый объект, политику и т.п. и Remove -удалить объект, политику и т.п. Командлеты не чувствительны к регистру. Написать Get или get не важно, powershell воспримет эти команды одинаково. Чтобы получить список всех доступных командлетов необходимо использовать GetCommand Get-Command 1 16 Для получения справки по любому командлету напишите Get-Help имя-комндлета Get-Help Get-Command Вывод списока командлетов для управления процессами: Get-Command *Process* 17 Вывод списка процессов с именем WhatsApp Get-Process -Name WhatsApp –IncludeUserName Задание №4. Алиасы Алиасы в Powershell это по сути более короткие названия командлетов. Т.е. любому командлету можно присвоить свое короткое имя (alias). Например алиасом для командлета Get-Process является gps. Согласитесь куда проще и быстрее написать gps чем Get-Process. Список всех alias можно получить используя командлет Get-Alias PS C:\WINDOWS\system32> get-alias Конвейер Конвейер используется для передачи выходных данных командлета идущего вначале во входные данные командлета следующего за ним. 18 Для получения более сокращенной формы отчета служит командлет Select-Object. Давайте используем его в конвейере. Get-Process|Select-Object ID,CPU,ProcessName 1 19 Теперь можно передать эти данные дальше. Например выгрузить в текстовый файл Get-Process|Select-Object ID,CPU,ProcessName|Out-File C:\TMP\out.t Структура объектов В Powershell объекты играют самую важную роль. От типа объекта зависит что именно с ним можно сделать. Узнать тип объекта и вывести список всех его элементов позволяет команда Get-Member Get-Process|Get-member 20 Скрипты Powershell Скрипты сохраняются в файлах с расширением ps1 Скрипт будет запускать блокнот, далее выполняется проверка если блокнот запущен выводится сообщение об этом и после блокнот закрывается. Если блокнот не запущен то выводится соответствующее сообщение об этом. На самом деле блокнот будет всегда запущен, т.к. мы вначале скрипта написали Start-Process notepad Start-Process notepad $a=Get-Process notepad if ($a.ProcessName -like "Notepad") { Write-Host "Блокнот запущен, давайте его закроем" Stop-Process -name notepad } else { Write-Host "Блокнот не запущен, что поделать" } 21 Для включения возможности запуска скриптов Powershell необходимо запустить Powershell от Администратора и ввести командлет Set-ExecutionPolicy с одним из параметров: Restricted — политика по умолчанию. Выполнение всех скриптов запрещено RemoteSigned — разрешено запускать собственные скрипты и подписанные доверенным разработчиком AllSigned — разрешено запускать скрипты, подписанные доверенным разработчиком. Каждый раз перед запуском такого скрипта PowerShell будет запрашивать подтверждение Unrestricted — в системе разрешается запускать любые скрипты Если вы полностью уверены в запускаемых скриптах можете поставить Unrestricted. Давайте так и сделаем Set-ExecutionPolicy -Unrestricted Будет предупреждение по безопасности, соглашаемся нажав Y Можем посмотреть текущую настройку политики безопасности при помощи командлета Get-ExecutionPolicy Get-ExecutionPolicy 22 Здание №5. Переменные Powershell Переменные Powershell объявляются при помощи знака $ и могут быть созданы в любом месте скрипта. При создании переменной нет необходимости указывать ее тип, система попытается определить его сама. В имени переменной допустимы любые буквы, цифры и знак подчеркивания. Создание переменных Давайте создадим несколько новых переменных и проверим что все получилось $a="Переменная1" $b="12345" $c=Переменная 3 $d=12345 Мы видим что успешно созданы 3 переменные: $a, $b, $d . Переменная $c не создалась и вылезла ошибка. Дело в том что в переменной $c при объявлении мы добавили пробел но не поставили кавычки. Если необходимо занести в переменную текст с пробелом нужно обязательно использовать кавычки. Посмотрим тип созданных переменных. $a.GetType().Fullname $b.GetType().Fullname $c.GetType().Fullname $d.GetType().Fullname 23 Переменная $a и $b имеют тип строка (System.String). Если с $a все понятно, там использовались буквы и цифра, то $b стала строкой только потому что мы занесли цифры в кавычки. А в переменной $d мы использовали цифры без кавычек, поэтому тип переменной стал число (System.Int32). Переменная $c выпала с ошибкой NULL потому как еѐ не существует. Важно помнить, если вы случайно попытаетесь присвоить значение переменной которая уже существует, старое значение в ней изменится на новое. Поэтому необходимо быть осторожным в именовании переменных, и перед созданием новой, просто введите в Powershell еѐ название и нажмите Enter. Если переменная не существует то система ничего не выведет кроме пустой строки. Сделать из переменной $d строку: $d=[string]$d Типы данных Powershell Рассмотрим типы данных бывают в Powershell Тип Класс .NET [string] System.String [char] System.Char [bool] System.Boolean [int] [long] [decimal] System.Int32 System.Int64 System.Decimal [single] System.Single [double] System.Double Описание Строка Символ (как элемент кода UTF-16) Булево (принимает значение $true или $false) 32-разрядное целое число 64-разрядное целое число 128 битное десятичное число. В конце числа буква d обязательна Число одиночной точности с плавающей запятой Число двойной точности с плавающей запятой 24 [DateTime] System.DateTime [array] System.Object[] [hashtable] System.Collections.Hashtable Представляет текущее время выраженное датой и временем суток. Массив. Предоставляет методы для создания, изменения, поиска и сортировки массивов Хеш-таблицы. Представляет коллекцию пар «ключ-значение», которые упорядочены по хэш-коду ключа. Отличие от массивов это использование именованных ключей вместо индексов. Давайте присвоим переменной $e булево значение $e=$True Теперь $e имеет тип System.Boolean, добавим кавычки и посмотрим что будет $e="$True" Переменная стала System.String. Сделаем из нее снова булево, но кавычки убирать не будем $e=[bool]$e С датой также можно работать сделав преобразование из строки. Давайте создадим переменную $data и добавим текст «01/01/2001» это будет в формате строки $data="01/01/2001" И теперь можно преобразовать эту строку в формат даты и посмотреть на вывод [datetime]$data 25 Задание №6. Массивы Массив имеет тип System.Object[] и каждый элемент в массиве может иметь свой тип. Создадим переменную $massiv и добавим в неё 3 значения: два строковых и одно число. Затем определим тип каждого элемента обратившись к нему по очереди. Обратиться к элементу массива можно указав его порядковый номер в скобках []. Расчет начинается с 0 $massiv="element1",2,"tri" 26 Рассмотрим последний тип данных это hashtable. Хеш-таблицы отличаются от массива тем что вместо индекса используют пару «ключ-значение». Объявляется в таком формате: @{kluch1=»Nomer1″;kluch2=»Nomer2″;kluch3=»Nomer3″}. Давайте создадим переменную $hash и занесем в нее хеш-таблицу $hash=@{kluch1="Nomer1";kluch2="Nomer2";kluch3="Nomer3"} Тут как в массиве, каждый элемент может иметь свой тип. Можно применять всевозможные сортировки, выборки и исключения. Область действия Необходимо помнить, все созданные пользователем переменные хранятся только в текущем сеансе Powershell. После закрытия окна консоли и повторного открытия переменных уже не будет. Существует две области действия переменных: глобальная и локальная. Глобальная область действия используется на весь сеанс Powershell. Она состоит из переменных Powershell, системных переменных и переменных определенных в консоли (в рамках текущего сеанса Powershell). Локальные переменные работаю только в той области для которой они определены (функция или скрипт) не выходя за ее пределы. Рассмотрим работу глобальной и локальной переменной function func_test { $test_local="LOCAL" $test_local $Global:test_global="GLOBAL" $test_global } Создали функцию в которой прописали две переменные $test_local — локальная переменная, действует только внутри этой функции. Переменная $test_global — 27 глобальная, данные в ней сохраняются даже после завершения работы функции, в отличие от локальной. Задание №7. Работа с переменными Для работы с переменными существует 5 командлетов. Get-Command *Variable* Название Get-Variable Назначение Получить значение переменой NewVariable Создать новую переменную Set-Variable Изменить переменную ClearVariable Очистить переменную RemoveVariable Удалить переменную Описание Позволяет получить значение переменной со всеми дополнительными параметрами. Если не указать название переменной, командлет выведет список всех текущих переменных Powershell. Создает новую переменную с возможностью задать дополнительные параметры. Можно создать переменную только для чтения, скрытую переменную или переменную с пробелом в имени Изменение значений в переменной. В случае отсутствия переменной с указанным именем, она будет создана. Удаляет все значения в переменной, но не саму переменную. Тип переменой остается тот же что был до очистки значений. Удаляет переменную со всеми ее значениями Работа с переменными Запустим командлет Get-Variable Get-Variable 28 Мы видим список всех переменных Powershell, большая часть из них это системные переменные. Get-Variable hash Видим что тут большее число параметров чем можно указать при заведение через знак $. Попробуем создать новую переменную только для чтения. После ее создания значение переменной нельзя будет изменить. 29 New-Variable -Name rd -Option ReadOnly -Value 100 -Description "Только для чтения" Get-Variable -Name rd|Format-List Попробуем изменить в ней значение Set-Variable -Name rd -Value 200 Появилась ошибка, потому что переменная только для чтения. Данный параметр бывает полезен в скриптах. Его используют для постоянной переменной которую нельзя менять. Удалим переменную Remove-Variable -Name rd –Force Параметр -Force указывать обязательно, иначе переменную только для чтения не удалить. Удобство использования переменных заключается в том, что мы можем использовать ее для сокращения записи. Получим список процессов firefox с параметрами используемой памяти $fire=(Get-Process -Name firefox)|select Name, PagedMemorySize64 30 Переменные окружения Переменные окружения Windows также доступны из Powershell. Доступ к ним можно получить через диск ENV: dir ENV: 31 Задание №8. Операторы сравнения Powershell В Powershell используются операторы сравнения на основе букв. Очень хочется написать знак > вместо -gt или знак = вместо -eq. Перед оператором сравнения или логическим оператором обязательно нужно ставить знак — Операторы сравнения Оператор Значение Описание -eq Equal Равно -ne Not equal Не равно -gt Greater than Больше -ge Greater than or equal Больше или равно -lt Less than Меньше -le Less than or equal Меньше или равно -like Wildcard comparison Используется подстановка символов для поиска по шаблону -notlike Wildcard comparison Используется подстановка символов для поиска не соответствия указанному шаблону -match Regular expression comparison Использование регулярных выражений для поиска по шаблону -notmatch Regular expression comparison Использование регулярных выражений для поиска не соответствия указанному шаблону -contains Containment operator Определяет, содержит ли значение слева от оператора значение справа -notcontains Containment operator Определяет, что значение слева от оператора не содержит значение оператора справа -in Containment operator Возвращает true если искомое значение содержится в коллекции -notin Containment operator Возвращает true если искомое значение не содержится в коллекции -replace Replace operator Заменяет часть или все значение слева от оператора -is Type Возвращает true если оба объекта одинаковы -isnot Type Возвращает true если оба объекта разные По умолчанию все операторы сравнения нечувствительны к регистру. Чтобы сделать оператор сравнения чувствительным к регистру, перед именем оператора поставьте букву c. К примеру, чувствительной к регистру оператор -eq пишется как -ceq. Чтобы 32 сделать нечувствительность к регистру явной, перед оператором ставится i. К примеру, явно нечувствительная к регистру версия оператора -eq это -ieq. Когда входные данные для оператора являются скалярным значением (число), операторы сравнения возвращают логическое значение. Если входные данные представляют собой набор значений, операторы сравнения возвращают любые совпадающие значения. Если в коллекции нет совпадений, операторы сравнения возвращают пустой массив. Исключение составляют операторы contains, notcontains, in, notin, is, isnot которые всегда возвращают логическое значение. 1, 2, 4, 8 -eq 2 1, 2, 4, 8 -eq 3 В первом варианте при сравнении набора чисел с 2 такое число есть в массиве. Во втором варианте при сравнении с 3 возвращается пустой массив, такого числа нет. Проверка: 20 -eq 20 21 -eq 20 "Проверка" -eq "Проверка" "Проверка" -eq "Проверка не прошла" "Test_ne" -ne "Test" Сравним между собой две даты. 33 Поиск файлов больше определенного размера: Get-ChildItem -Path c:\ -Recurse|Where-Object {$_.Length -ge 40000000} Удобный инструмент в качестве автоматизации чистки логов. Операторы сдерживания Операторы сдерживания (-contains и -notcontains) аналогичны операторам равенства. Только операторы сдерживания всегда возвращают логическое значение, даже если входными данными является коллекция. В отличие от операторов равенства, операторы сдерживания возвращают значение, как только они обнаруживают первое совпадение. Операторы равенства оценивают все входные данные, а затем возвращают все совпадения в коллекции. "Вася","Петя","Маша" -contains "маш" "Вася","Петя","Маша" -contains "маша" 34 Оператор замены Оператор замены (-replace) заменяет все или часть значения указанным значением с помощью регулярных выражений. Оператор -replace можно использовать для многих административных задач, таких как переименование файлов, замена текста в файле и прочее. Массовое переименованию файлов *.log в *.bak Get-ChildItem *.log | Rename-Item -NewName { $_.name -replace '\.log$','.bak' } "Настала заря информатизации" -replace "заря","эра" Логические операторы Powershell Оператор Описание -and Оба условия должны быть истины, чтобы выражение было истинно -or Одно или оба условия должны быть истины, чтобы выражение было истинно -xor Одно условие должно быть истинно, а второе должно иметь значение ложь, чтобы выражение было истинно -not Указанные условия должны иметь значение ложь, чтобы выражение было истинно ! Указанное условие должно иметь значение ложь, чтобы выражение было истинно Логические операторы PowerShell соединяют выражения и операторы, позволяя использовать одно выражение для проверки нескольких условий. Задача найти файлы определенного размера. А именно чтобы они были больше одного числа но меньше другого. Get-ChildItem|Where-Object {$_.length -gt 30000 -and $_.Length -lt 40000} 35 Список файлов в папке Windows объемом больше 30 Кбайт но меньше 40 Кбайт. Задание №9. Операторы условий Powershell Оператор IF IF (если) — вычисляет значение заданное в круглых скобках (). Если результатом вычисления является логическое True, то выполняется конструкция команд в фигурных скобках {}. Если результат вычисления будет False выполнятся команды следующие за фигурными скобками $test_operator=$True if ($test_operator) { Write-Host "УРА. Оператор имеет значение TRUE" } Результатом выполнения данного скрипта будет вывод в консоль фразы: УРА. Оператор имеет значение TRUE. Если переменная $test_operator будет иметь значение FALSE фразы указанной выше не появится, т.к. командлет выводящий данную фразу на экран находится в {} скобка Оператор ELSE ELSE (иначе) — используется в связке с оператором IF. Оператор ELSE позволяет определить что делать в случае если оператор IF не равен TRUE. Написание конструкции состоит из оператора ELSE, далее идут фигурные скобки. $proc=(Get-Process).ProcessName if ($proc -like "notepad") { Write-Host "Блокнот запущен." 36 } else {start notepad} В переменную $proc мы сохраняем список запущенных процессов с указанием вывода по полю ProcessName. Далее оператором if сравниваем, есть ли в переменной $proc запущенный процесс с именем notepad. Если есть, то выводим на экран сообщение Блокнот запущен. Если такого процесса нет в ход идет конструкция else и выполняет команды в фигурных скобках, то есть запускает notepad. Данный скрипт конечно в простейшем варианте, но тоже пригоден и часто используется системными администраторами. Очень удобно контролировать запущен ли конкретный процесс и если нет запускать его. Пример: $proc=(Get-Process).ProcessName $len=($proc -like "notepad").Length if ($proc -like "notepad") { if ($len -ge 2) {Write-Host "Количество запущенных блокнотов =" $len} else { Write-Host "Блокнот запущен."} } else {start notepad} В первом условии if мы сравниваем переменную $proc и в случае положительного результата переходим в вложенному if. Во втором (вложенном) if мы сравниваем переменную $len с двойкой. Если запущено 2 и более процесса notepad будет выведено сообщение с указанием количества запущенных блокнотов. В случае 1 запущенного блокнота будет сообщение Блокнот запущен. Если блокнот не запущен, в последнем операторе else скрипт его запустит. Задание №10. Оператор SWITCH SWITCH — использует немного другой синтаксис для сравнения значений. Его еще называют оператор переключения. В круглых скобках указывается выражение, результат которого сравнивается со значениями в фигурных скобках. 37 $names = 'Даша' switch ($names) { 'Даша' { 'Поздравляю вы выбрали Дарью' } 'Машу' { 'Вы выбрали Марию' } 'Глафира' { 'Вы выбрали Глафиру' } Default {"Вы никого не выбрали получайте Колю"} } В переменной $names мы указали имя Даша. Оно последовательно сравнивается с каждым именем в фигурных скобках. Если не одно из имен не подошло, выполняется действие указанное в параметре Default. Параметр default не обязательный можно его не указывать. В случае отсутствия совпадения скрипт просто завершит работу. Циклы Powershell Циклы необходимы для повторного выполнения одинаковых операций с использованием разных значений. Есть циклы обрабатывающие данные получаемые из конвейера (ForEach-Object) и работающие отдельно (ForEach). ForEach Цикл ForEach служит для пошаговой переборки значений из коллекции элементов. Обычно при помощи цикла foreach перебирают элементы в массиве. ForEach является самым простым для понимания и чаще всего используемым циклом в Powershell. ForEach не работает с конвейером для этого есть ForEach-Object. foreach ($item in $collection) {script block} 38 Переменная $collection это массив определенный заранее. Переменная $item — это текущий элемент из $collection. По очереди перебираются все элементы из массива $collection. Далее в фигурных скобках обычно вызывают переменную $item обращаясь к текущему элементу коллекции. Сценарий по удалению старых журналов сервера IIS: $data=((Get-Date).Date).AddDays(-10) $massiv=Get-ChildItem C:\script\ |Where-Object {$_.LastWriteTime -lt $data} foreach ($a in ($massiv).Fullname) { Remove-Item $a } Переменная с массивом чисел и в цикле: $test=1,2,3,4,5 foreach ($name in $test) { $name+10 } Сценарий постоянно проверяющий запущен ли процесс. Если процесс запущен то ничего не делать, если не запущен то запустить: $a=1 while($a -eq 1) { if ([bool](Get-Process notepad -ErrorAction SilentlyContinue) -eq $true) {Write-Host "Блокнот запущен! "} else {Start-Process notepad} 39 Start-Sleep -Seconds 30 } В данном случае while проверяет $a=1, если да то выполнить набор команд. Но $a у меня всегда 1 поэтому цикл будет бесконечный. Это образец скрипта для контроля запущенного процесса. For Цикл For — обычно используется для создания цикла, выполняющего команды в командном блоке пока указанное условие оценивается как верное ($True). for ($z=2; $z -le 20; $z++) { Write-Host "Текущее значение переменной z="$z } Внешний ip адрес $ip = new-object System.Net.WebClient $ip.DownloadString("http://ipinfo.io/ip") 40 Проверить настройки DNS сервера, а также узнать IP адрес домена: Get-DnsClientServerAddress Resolve-DnsName yandex.ru Используя командную строку (PowerShell) узнаем, прикреплѐн ли компьютер к домену или входит в рабочую группу. $ComputerSystem = Get-CimInstance -Class Win32_ComputerSystem; $ComputerName = $ComputerSystem.DNSHostName 41 if ($ComputerName -eq $null) { $ComputerName = $ComputerSystem.Name } $fqdn = ([System.Net.Dns]::GetHostByName($ComputerName)).HostName $ComputerSystem | Microsoft.PowerShell.Utility\Select-Object ` @{ Name = "ComputerName"; Expression = { $ComputerName }}, @{ Name = "Domain"; Expression = { if ($_.PartOfDomain) { $_.Domain } else { $null } }}, @{ Name = "DomainJoined"; Expression = { $_.PartOfDomain }}, @{ Name = "FullComputerName"; Expression = { $fqdn }}, @{ Name = "Workgroup"; Expression = { if ($_.PartOfDomain) { $null } else { $_.Workgroup } }} Заключение В данном практикуме рассмотрены теоретические положения и структура командной оболочки Windows PowerShell, рассмотрены варианты выполнения простых и сложных процедур управления ресурсами компьютерных систем. Надеемся, что степень изложения материала и выполненные лабораторные работы помогут более эффективно разрабатывать и эксплуатировать информационные системы в различных областях деятельности. 42 Список используемой литературы 1. Гордеев, А.В. Операционные системы: учебник для вузов / А. В. Гордеев. – 2-е изд. – Санкт-Петербург : Питер, 2007. – 416 с. 2. Назаров, С. В. Операционные системы. Практикум : учебное пособие / С. В. Назаров, Л. П. Гудыно, А. А. Кириченко. – Москва : КНОРУС, 2012. – 376 с. 3. Таненбаум, Э. Современные операционные системы / Э. Таненбаум. – 3-е изд. – Санкт-Петербург : Питер, 2012. – 1120 с. 43