Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
gmaster
7 лет назад

Академия: Windows PowerShell Basics. Модуль #2


Конспект курса лекций для Академии

Конспект модуля №1. Введение
В этом модуле речь пойдёт о конвейере PowerShell, объектах и примерах работы с ними.

Модуль #2. Pipeline

2.1. Что такое Pipeline?

Windows PowerShell это процесс, структура которого представляет собой конвейер в котором выполняются команды пользователя. Официально, в первоисточнике он именуется как Pipeline - трубопровод, но сути это не меняет, поэтому во всех русскоязычных источниках его называют конвейером, ибо благозвучнее. Да и во многом ближе к сути понимания процесса, так как исходя из названия понятно, что команды выполняются последовательно.
Конвейер в определенный момент времени может выполнять одну или несколько команд. Если необходимо выполнить несколько командлетов, каждая команда и ее параметры разделяются символом вертикальной черты (|). По мере запуска результат исполнения может быть передан следующей команде.
Например, чтобы выполнить несколько команд одновременно, мы должны написать:

Get-Service | Out-File ServiceList.txt 

В результате выполнения в большинстве случаев на выходе Вы получите объект, который имеет свои определённые свойства, события и методы. Если рассматривать данный объект крайне упрощенно, то его можно представить в виде таблицы:

Объект в крайне упрощённом виде можно представить как структуру данных

Свойства описывают атрибуты объекта. Примерами свойств могут быть имя службы, идентификатор процесса или сообщение журнала событий.
Свойства объекта называются members
Для того, чтобы просмотреть все members определённого командлета, необходимо запустить параллельно с ним команду get-members, которая выведет на экран результат своей работы.
Например, вводим:

Get-Service | Get-Member

И получаем кучу members:

У объектов достаточно много свойств, на скриншоте запечатлена только малая часть..

События срабатывают, когда меняются какие-либо свойства объекта. Инициировать определённое событие может, например какой-либо сторонний процесс.
Методы описывают способы выполнения каких-либо действий, например, очистки журнала

2.2. Сортировка объектов

Некоторые команды Windows PowerShell при исполнении запроса на вывод данных отображают их в определенном порядке. Если Вам нужно выдернуть из списка какой-либо элемент, либо выполнить какую-то другую задачу, например отсортировать процессы по степени загрузки процессора, нужно применить командлет Sort-Object.

Немногочисленные функуции сервлета Sort-Object часто бывают весьма полезны 

Пример применения:

Get-Service | Sort Status, Name

2.3. Подсчет и выбор объектов

Для подсчёта объектов используется командлет Measure-Object
Применять его также достаточно просто. Например, мы можем посчитать колическво активных сервисов:

Get-Service | Measure-Object

Measure-Object имеет параметр -Property. Он позволяет указать свойства, которые могут содержать числовые значения, либо параметры, указанные в таблице:

Просто таблица, которую автор конспекта зачем-то сделал в виде изображения

Можно осуществить выборку из полученных результатов, для этого существует команда Select-Object.
С помощью Select-Object можно выбрать определенное количество строк с начала (-First) или конца (-Last) коллекции. Также можно пропустить некоторое количество строк (-Skip) до начала выборки.
Пример: выберем 10 процессов, которые потребляют меньше всего виртуальной памяти:

Get-Process | Sort-Object -Property VM | Select-Object -First 10

Можно строить и куда более сложные запросы:

Get-Process | Get-Member | Sort-Object -Property Name | Select-Object Name,MemberType | Select-Object -First 15

Здесь мы используем Get-Process для получения списка процессов, затем Get-Member и Sort-Object для сортировки по имени, а затем Select-Object для отображения нужных свойств и выборки первых пятнадцати элементов..

2.4. Преобразование, экспорт и импорт объектов

Windows PowerShell включает в себя возможность конвертировать объекты конвейера в другие формы представления данных. Например, коллекция объектов может быть преобразована в HTML-страницу, CSV, либо XML файл.
Для того, чтобы осуществить преобразование, можно использовать методы ConvertTo и Export.

Также существует командлет Out-File, который может принимать входные данные из конвейера и записывать эту информацию в файл. В файл записывается только то, что выводится в консоли:

Get-Service | Out-File -filepath c: \ test \ test1.txt

Либо, можно добавить то, что выводит командлет к существующему файлу:

Get-Service | Out-File c: \ test \ test1.txt -append

Вполне очевидно, что импорт данных производится с помощью метода Import
Под импортом из внешнего хранилища подразумевается двухэтапный процесс:

  • Данные считываются из внешнего хранилища
  • Данные преобразуются из этого формата в объекты.

На практике применить просто. Cначала делаем экспорт в файл списка всех процессов:

Get-Process | Export-CSV processes.csv

Ну а дальше можно сделать выборку и импортировать в этом же или другом скрипте то, что нам нужно:

Import-CSV processes.csv | Sort-Object -Property VM -Descending | Select-Object -First 10

Метод Import сразу обрабатывает данные согласно указанного формата. Но существует возможность прочитать сырые данные и обработать их вручную при помощи командлета Get-Content.

Принципиальное отличие Get-Content от Import страждущий может улицезреть на диаграмме связей 

2.5. Рассчитываемые свойства

Select-Object также может использоваться для создания пользовательских настраиваемых, либо рассчитываемых свойств.

Чтобы создать настраиваемое свойство, нужно использовать определенный синтаксис. По существу, вы создаете хеш-таблицу имен и пар значений:

 @{
  n='VirtualMemory';
  e={ $PSItem.VM }
 }

Хэш-таблица, представляет собой компактную структуру данных, в которой хранится одна или несколько пар ключ / значение. Например, хэш-таблица может содержать ряд IP-адресов и имен компьютеров, где IP-адреса являются ключами, а имена компьютеров - значениями. В примере выше, виртуальная память является значением свойства VM.
Пример использования:

Get-Process | Select-Object Name, @{n='Pageable Memory (MB)'; e={$PSItem.PM / 1GB}}

Запрос будет выводить значения параметров в гигабайтах

2.6. Операторы сравнения

Операторы сравнения позволяют указать критерии для объектов, которые вы хотите найти. Вы просите оболочку сравнить какое-либо свойство объекта с определенным вами значением, и если сравнение истинно, объект сохраняется. В принципе, это почти то же самое, что и Select-Object, но удобнее. Важный факт, по умолчанию включена проверка регистра.
табличка

Пример использования:

Get-Process | Where { $PSItem.CPU –gt 30 –and $PSItem.VM –lt 10000 }

2.7. Перечисление процессов в конвейере

И теперь расскажу о вишенке на торте текущего курса.
Перечисление - это процесс выполнения задачи по одному разу для каждого объекта в коллекции.
Пример в данном случае, по моему мнению, авторы курса выбрали не очень удачный. Но тут уж поделать с этим ничего нельзя, посему, конспектирую то, что есть.
Начиная с Windows XP во всех операционных системах Microsoft существует встроенная технология шифрования данных EFS, а у любой учётной записи Windows есть свой сертификат. И каждый пользователь может зашифровать при помощи этого сертификата данные, к которым у него есть доступ.
Для того, чтобы совершить сие непотребство средствами PowerShell сначала необходимо получить список файлов. Затем, используем командлет Get-ChildItem который имеет параметр -File для получения информации о файле. Этот тип объекта, System.IO.FileInfo, имеет метод с именем Encrypt (), который может шифровать файл, используя сертификат шифрования текущей учетной записи пользователя.
Эквивалентная команда не встроена в Windows PowerShell, поэтому нам придется выполнить этот метод во всех объектах файлов, которые мы хотим зашифровать.
Вот тут нам и пригодится перечисление процессов в конвейере. Перечисление позволяет вам сделать это с помощью команды ForEach-Object.

Get-ChildItem –Path D:\  -File | ForEach-Object –MemberName Encrypt()

Но это слишком длинный способ, его можно упростить используя алиасы. –MemberName необязательный параметр, его можно отбросить, если Вы будете шифровать файлы сертификатом по умолчанию. В итоге получим:

Get-ChildItem –Path C:\Encrypted\ -File | % Encrypt

Как зашифровать данные чужим сертификатом догадаться несложно, благодаря подробной встроенной справочной системе.

Вот таким вот нехитрым способом, всего при помощи пары строчек кода любой недоумок, знакомый с PowerShell и получивший права администратора на Вашем контроллере домена, может зашифровать все данные на всех компах до которых дотянется. И антивирус тут вряд-ли поможет, так как PowerShell встроенный инструмент, который обычно относится к доверенным приложениям.
Это ещё раз говорит нам о важности обеспечения мер хотя-бы базовой безопасности, которыми многие к сожалению, пренебрегают.

Что для вас было наиболее интересным и впечатляющим в данной неделе курса?

После прохождения модуля, PowerShell открылся мне с новой, доселе неизвестной стороны. Впечатлила простота и элегантность технических решений разработчиков. Действительно, PowerShell сейчас, это намного больше чем та командная строка родом из MS-DOS, которую все мы знаем и любим. В целом, понравилось то, что в данном модуле много практических примеров. Очень годные задания, которые предлагаются для выполнения. Я залип на полночи, разбираясь в тонкостях и перипетиях реализации определённых вещей. Честно говоря, думал что это просто обычный банальный курс, но он оказался весьма интересным.
В третьей части будем заниматься переменными, работать с системными файлами и службами, а напоследок постигнем азы низкоуровневого форматирования. Не пропустите))

12
195.148 GOLOS
На Golos с May 2017
Комментарии (3)
Сортировать по:
Сначала старые