Шаг 5: изучение имён
Есть причина того, почему показанные до сих пор командлеты выглядят сходным образом: get-childitem, update-help, get-help используют единую схему глагол-существительное. Это соглашение применяют все командлеты PowerShell, в них глагол стоит перед единственным существительным. Это понравится тем, кто в своё время пострадал от непостоянства названий команд в языках VB и VBA.
Взгляните на самые распространенные командлеты:
set-location: устанавливает текущую рабочий локацию на определённую локацию
get-content: получает содержимое файла
get-item: получает файлы и папки
copy-item: копирует объект из одной локации в другую
remove-item: удаляет файлы и папки
get-process: получает процессы, запущенные на локальном или удаленном компьютере
get-service: получает сервисы, запущенные на локальном или удаленном компьютере
invoke-webrequest: получает содержимое с веб-страницы в интернете
Для просмотра работы определённой командлеты используйте get-help как в случае
get-help copy-item -full
На основе описания в помощи можно понять, что необходимо командлете. Например, если вы хотите копировать все файлы и папки из Documents в c:\temp, используйте
copy-item c:\users\ \documents\* c:\temp
Введя эту команду, вы увидите несколько интересных возможностей окружения PowerShell. Например, если набрать copy-i и нажать кнопку Tab, PowerShell заполнит Copy-Item. Если неправильно набрать командлету и PowerShell не может распознать её, даётся полное описание того, что было сделано не так.
Попробуйте данную командлету:
invoke-webrequest askwoody.com
Вы получите краткий список заголовков, изображений, ссылок и прочего содержимого веб-страницы
Обратите внимание в get-help на список invoke-webrequest, который «возвращает коллекцию форм, ссылок, изображений и прочие важные элементы HTML» — именно то, что должно показываться на экране
Некоторые командлеты помогают управлять самим PowerShell:
get-command: список всех доступных командлет
get-verb: список всех доступных глаголов
clear-host: очистка экрана программы-хоста
Разные параметры позволяют уменьшать команды и сужать круг полезных опций. Например, для просмотра списка всех командлет, работающих с сервисами Windows, введите
get-command *-service
Будут показаны все глаголы, доступные с существительным service. Вот их список:
Get-Service
New-Service
Restart-Service
Resume-Service
Set-Service
Start-Service
Stop-Service
Suspend-Service
Можно объединять эти командлеты с другими.
Write-Output
Командлет Write-Output отправляет указанный объект по конвейеру следующей команде. Если команда является последней командой в конвейере, объект отображается в консоли.
Write-Output отправляет объекты по основному конвейеру, также известному как «выходной поток» или «». Чтобы отправить объекты ошибок по конвейеру ошибок, используйте Write-Error.
Этот командлет обычно используется в сценариях для отображения строк и других объектов на консоли. Однако, поскольку поведение по умолчанию заключается в отображении объектов в конце конвейера, обычно нет необходимости использовать командлет. Например,
Get-Process | Write-Output
эквивалентно
Get-Process
Итак, одной из особенностей echo и Write-Output является то, что эти команды не требуются.
Другая особенность — эти команды работают с объектами, поэтому простая строка с запятыми может быть выведена не так, как вы ожидаете.
К примеру, команда
Write-Output 1,2,3
Выведет:
1 2 3
Аналогично:
Write-Output Just a string Just a string
Дело в том, что эти строки расцениваются как объекты, свойства которых перечислены через запятую и каждое новое свойство выводится на отдельной строке. Если вы хотите избежать такого поведения, то просто помещайте строку в одинарные или двойные кавычки.
Пример 1: Получение объекта и вывод его в консоль
$P = Get-Process Write-Output $P
Первая команда получает список процессов, запущенных на компьютере, и сохраняет их в переменной $P.
Вторая команда отображает объекты процесса в $P на консоли.
Пример 2: Передача вывода другому командлету
Write-Output "test output" | Get-Member
Эта команда передаёт строку «test output» командлету Get-Member, который отображает члены класса System.String, демонстрируя, что строка была передана по конвейеру.
Пример 3: Подавление перечисления в выводе
Write-Output @(1,2,3) | Measure-Object
Вывод:
Count : 3 ...
Write-Output @(1,2,3) -NoEnumerate | Measure-Object
Вывод:
Count : 1 ...
Эта команда добавляет параметр -NoEnumerate для обработки коллекции или массива как одного объекта в конвейере.
Использование удаленно
Вызывать подобный скрипт удаленно, используя WinRM (PSRemoting), не получится. Это связано с разными сеансами, в которых работает сам пользователи и Powershell. Если вы ищете простой вариант вывода сообщений удаленно — вам может больше подойти статься по программе msg и ее использование в Powershell, которая работает в этом случае исправно.
Можно использовать программу ‘psexec’ от SysInternals, но это так же достаточно сложный процесс. В первую очередь мы должны узнать номер сессии в которой работает пользователь. Самый простой способ сделать это — использовать ‘quser’:
О quser и другие способах подключения описывалось в предыдущих статьях. Удаленный вариант, с quser, сработает только в том случае, если вы являетесь привилегированным пользователем для подключения к удаленному компьютеру. Использовать эту команду с WinRM, скорее всего, приведет к проблемам с кодировками. Из результата работы команды вам нужно значение с ID.
Имея этот идентификатор и скаченную утилиту ‘psexec’, вы сможете запустить командлет следующим образом:
Пример, который я сделал для видео:
…
Теги:
Другие командлеты Windows PowerShell
Также хотелось бы выделить следующие командлеты Windows PowerShell, которые наверняка Вам понадобятся и будут полезны.
- Get-ExecutionPolicy – с помощью данного командлета можно узнать действующую политику выполнения Windows PowerShell для текущего сеанса;
- Set-ExecutionPolicy – командлет изменяет политику выполнения Windows PowerShell;
- Write-Host – выводит информацию на экран (пишет текст);
- Read-Host – считывает строку ввода из консоли;
- Write-Warning – выводит предупреждающее сообщение;
- Write-Error – командлет объявляет ошибку и выводит ее в поток ошибок;
- Get-Date – возвращает текущую дату и время;
- Set-Date – командлет изменяет системную дату и время на компьютере.
Вот мы с Вами и рассмотрели полезные и часто используемые командлеты Windows PowerShell, надеюсь, этот справочник будет Вам полезен, удачи!
- https://tproger.ru/translations/powershell-tutorial/
- https://techarks.ru/windows/powershell/10-osnovnyh-komand-powershell-kotorye-dolzhen-znat-kazhdyj-polzovatel-windows-10/
- https://info-comp.ru/sisadminst/555-directory-windows-powershell-cmdlets.html
Изменение пользователя, параметров безопасности и уровня запуска
Создавая задачи в планировщике мы имеем блок ‘Security Options’, который чаще используется с настройками по умолчанию. В этом блоке определяются следующие параметры:
- Пользователь, от имени которого будет выполнен запуск;
- Выполняется ли задача для вошедших в систему пользователей;
- Привилегии запуска (от пользователя/администратора);
- Совместимость.
В графическом интерфейсе эти параметры настраиваются в следующем блоке:
Так же как и в случае с созданием задачи, в случае ее изменения мы создаем разные объекты (результаты команд), которые затем привязываем через команду ‘Set-SchedukedTask’.
С помощью следующих команд мы изменим пользователя, повысим права и изменим совместимость:
# Изменяем пользователя и повышаем права запуска
$task_user = New-ScheduledTaskPrincipal -UserId ‘.\admin’ -RunLevel Highest
# Изменяем совместимость
$task_settings = New-ScheduledTaskSettingsSet -Compatibility ‘Win8’
# Добавляем объекты созданные выше к существующей задаче
Set-ScheduledTask -TaskName ‘Сбор логов’ -Principal $task_user -Settings $task_settings
1 |
# Изменяем пользователя и повышаем права запуска $task_user=New-ScheduledTaskPrincipal-UserId’.\admin’-RunLevel Highest # Изменяем совместимость $task_settings=New-ScheduledTaskSettingsSet-Compatibility’Win8′ # Добавляем объекты созданные выше к существующей задаче Set-ScheduledTask-TaskName’Сбор логов’-Principal$task_user-Settings$task_settings |
Если у вас будет следующая ошибка, то скорее всего она связана с неверным пользователем:
Set-ScheduledTask : No mapping between account names and security IDs was done.
Само собой эти же объекты можно использовать при создании (регистрации) задачи в планировщике:
$name = ‘Task 3’
Register-ScheduledTask -TaskName $name `
-Action $task_action `
-Trigger $task_trigger `
-Principal $task_user `
-Settings $task_settings
1 |
$name=’Task 3′ Register-ScheduledTask-TaskName$name` -Action$task_action` -Trigger$task_trigger` -Principal$task_user` -Settings$task_settings |
Учитывайте, что у New-ScheduledTaskSettingsSet около 30 возможных параметров (работа при отключенной батареи, максимальное количество перезапусков и т.д.). В примере выше рассмотрено лишь несколько.
Изменение триггеров и действий
С помощью Set-ScheduledTask так же добавляются и изменяются триггеры и действия. Изменение будут заключаться в полной замене существующих триггеров и действий у задач. Вам просто нужно создать объект по аналогии с тем, как это делалось в предыдущих разделах:
$trigger = New-ScheduledTaskTrigger -Daily -At 14:00
$action = New-ScheduledTaskAction -Execute Calc.exe
Set-ScheduledTask -TaskName ‘Сбор логов’ -Action $action -trigger $trigger
1 |
$trigger=New-ScheduledTaskTrigger-Daily-At1400 $action=New-ScheduledTaskAction-Execute Calc.exe Set-ScheduledTask-TaskName’Сбор логов’-Action$action-trigger$trigger |
Бэкап, удаление и восстановление задач планировщика с Powershell
Удобной возможностью использования Powershell является импорт и экспорт задач планировщика. По сути вы можете создать шаблон, который можно использовать на разных компьютерах без особой работы с кодом. По умолчанию, сам Powershell, не предоставляет прямой возможности бэкапа и восстановления, но это можно сделать через другие команды.
Резервное копирование
Для бэкапа мы можем использовать команду Export-CliXml. Для этого нам нужно будет получить задачу и использовать конвейер:
Get-ScheduledTask -TaskName ‘Сбор логов’ | Export-Clixml ‘C:\LogTaskBackup.xml’
1 |
Get-ScheduledTask -TaskName ‘Сбор логов’ | Export-Clixml ‘C:\LogTaskBackup.xml’ |
Для экспорта в Powershell так же есть ‘Export-ScheduledTask’, но нет аналогичной команды импорта. Что бы импортировать такие файлы-задачи мы можем использовать только GUI. Из-за этого она не приведена в примере выше.
Удаление, отключение и включение
При удалении задачи, по умолчанию, запрашивается подтверждение. Что бы этого не было добавляется ключ ‘Confirm’:
Unregister-ScheduledTask -TaskName ‘Сбор логов’ -Confirm:$False
1 |
Unregister-ScheduledTask -TaskName ‘Сбор логов’ -Confirm$False |
Если требуется только отключить задачу используйте Disable:
Disable-ScheduledTask -TaskName ‘Сбор логов’
1 |
Disable-ScheduledTask -TaskName ‘Сбор логов’ |
Включение:
Enable-ScheduledTask -TaskName ‘Сбор логов’
1 |
Enable-ScheduledTask -TaskName ‘Сбор логов’ |
Восстановление
Восстановление выполняется в несколько шагов. Первое — мы должны выполнить импорт XML документа в Powershell:
$task = Import-Clixml -Path ‘C:\LogTaskBackup.xml’
1 |
$task = Import-Clixml -Path ‘C:\LogTaskBackup.xml’ |
На одном из сайтов я прочитал, что следующий параметр нужно изменять на «Interactive», так как без него не будет работать задача, но у меня этот параметр не изменялся при экспорте:
$task.Principal
1 |
$task.Principal |
Этот параметр связан со входом пользователя через GUI. Аналогичное название в интерфейсе планировщика задач «Выполнять только для пользователей, вошедших в систему». Если этот параметр у вас отличается — вы сможете изменить его так:
$task.Principal.LogonType = ‘Interactive’
1 |
$task.Principal.LogonType = ‘Interactive’ |
Далее нам нужно зарегистрировать эту задачу определяя каждый из параметров отдельно:
Register-ScheduledTask `
-TaskName $task.TaskName `
-Action $task.Actions `
-Trigger $task.Triggers `
-Settings $task.Settings `
-Principal $task.Principal `
-User ‘administrator’ `
-Password ‘123’
1 2 3 4 5 6 7 8 |
Register-ScheduledTask ` -TaskName $task.TaskName ` -Action $task.Actions ` -Trigger $task.Triggers ` -Settings $task.Settings ` -Principal $task.Principal ` -User ‘administrator’ ` -Password ‘123’ |
Создание
Представим, что каждое утро вы проверяете 50 последних логов за 14 часов журнала Application с помощью этой команды:
Get-EventLog -LogName Application -Newest 50 | where TimeWritten -ge (Get-Date).AddHours(-14)
Команда не очень сложная, но в скором времени ее надоест писать. Для сокращения этой работы ее можно выделить в отдельную функцию:
Function Get-DayLog {
Get-EventLog -LogName Application -Newest 50 | where TimeWritten -ge (Get-Date).AddHours(-14)
}
Любая функция обязательно должна состоять из трех вещей:
- function — объявляет и говорит что после нее будет название;
- имя функции — название, по которому мы будем ее вызывать. В нашем случае имя Get-DayLog;
- скобки — обозначают начало и конец выражения.
После написания функции она вызывается по имени:
Get-DayLog
Учитывая, что нам может потребоваться получить данные не за последние 14 часов и более чем за 50 дней нам может потребуется изменить ее передав параметры.
Работа со службами и процессами
PowerShell, конечно же, умеет управлять службами и процессами в Windows, для этого существуют такие командлеты как:
- Get-Process – выводит информацию о запущенных процессах на компьютере;
- Start-Process – запускает один или несколько процессов на компьютере;
- Stop-Process — останавливает один или несколько запущенных процессов;
- Get-Service – выводит информацию о службах;
- Restart-Service – перезапускает службу;
- Start-Service – запускает службу;
- Stop-Service — останавливает службу;
- Suspend-Service – приостанавливает работу службы;
- Set-Service – с помощью данного командлета можно изменить свойства службы, например, описание, отображаемое имя и режим запуска. Также его можно использовать для запуска, остановки или приостановки службы.
Как установить программы с помощью CMD или Powershell
Установка приложений с помощью командлетов Powershell
Нерекомендуемый способ
Для примера установим браузер Chrome.Пишем в командной строке повершела командлет Install-Package, потом через пробел параметры, а именно: название нашего приложения — googlechrome, потом ключ -ProviderName, которым мы явно зададим с какого репозитория скачивать совт и название репозитория chocolatey. В самом конце добавим 2 ключа: -Verbose и -force. Первый для того, что бы видеть процесс инсталляции, второй — для игнорирования запросов, например на перезапись файла.В конечном итоге у вас должна получиться такая строка:
Install-Package googlechrome -ProviderName chocolatey -Verbose -force
Далее для установки другого приложения вам нужно только изменять названия пакета. Например, что бы установить архиватор WinRAR — нужно изменить googlechrome на winrar:
Install-Package winrar -ProviderName chocolatey -Verbose -force
Для того, что бы посмотреть, что вы там себе наустанавливали — нужно набрать командлет Get-Package без всяких параметров:
Get-Package
Он выведет на экран список всех установленных приложений.
Но Opera, Mozilla FireFox и ещё фигова туча приложений, которые есть в репозитории chocolatey, у вас не будут устанавливаться. Повершел ругнётся на неизвестный ему командлет, например на:
Более того, установить такое приложение другим способом, уже тоже не удастся. Система будет ругаться на то, что программа установлена. Поэтому, если вы столкнулись с такой ошибкой, обязательно наберите команду Uninstall-Package и название пакета, например:
Uninstall-Package opera
Короче, давайте срезюмируем. Данный метод имеет хоть и один, но очень серьёзный недостаток: несмотря на наличие приложения в репозитории — далеко не каждое может быть установлено. Выяснить это можно исключительно методом научного тыка.
Поэтому рекомендую использовать собственную утилиту проекта Chocolatey.
Установка приложений с помощью Chocolatey
Рекомендуемый способ
Репозиторий Chocolatey содержит постоянно обновляющуюся базу из более чем 5800 бесплатных и условно-бесплатных приложений.
Устанавливаем модуль Chocolatey. Он имеет свой синтаксис, зато приложения можно будет устанавливать, не только из повершела, но и из командной строки. Это делается всего одной командой:
iex ((New-Object System.Net.WebClient).DownloadString(‘https://chocolatey.org/install.ps1’))
Если ругнётся на:
Невозможно загрузить файл \chocolatey\chocInstall\tools\chocolateyInstall.ps1, так как выполнение сценариев отключено в этой системе.
То измените уровень безопасности командой выше.
Это всё что нужно сделать. Теперь вы можете устанавливать приложения, используя простейший синтаксис проекта Chocolatey.Для полноценного управления установкой приложений нам потребуется 5 команд:
- cinst название_пакета — установка приложения
- cuninst название_пакета — удаление приложения
- cup название_пакета — обновление приложения
- cup all — обновление всех установленных приложений
- clist название_пакета — поиск приложений
Например, для установки браузера Opera — запустим экземпляр командной строки CMD или PowerShell от имени Администратора. В адресную строку введём название команды cinst, название приложения opera и пару параметров:
cinst opera ––force ‑y
Параметр ‑‑force — будет игнорировать все ошибки, а так-же используется для принудительной переустановки приложения.Ключ ‑y — будет отвечать на все вопросы скриптов, установщика и системы утвердительно.
Для удаления — набирайте cuninst, название программы и ключ -y, например:
cuninst opera -y
А как же искать приложения? Для примера узнаем какое название имеет в каталоге Chocolatey десктопный Telegram. Для этого пишем команду clist и через пробел предполагаемое название пакета:
clist telegram
Как правило, первая же строчка и будет названием пакета с указанием её текущей версии в каталоге.
По такому же принципу, вы можете обновлять приложения. Команды для обновления сразу всех программ или по отдельности были чуть выше.
Как то так.
Запуск скриптов
Создавать сценарии можно в любом текстовом редакторе (лучше остановиться на Win, Notepad++ или подобному, с поддержкой синтаксиса или проверки) либо в программе PowerShell ISE.
Последняя предоставляет удобный доступ к командлетам, возможности запуска, отладки и сохранения сценариев.
Предположим, что свой первый скрипт вы написали (это получение перечня запущенных процессов), сохранили через меню «Файл», и его нужно запустить. Делается это тремя путями:
1 Прописываем полный путь к скрипту в PowerShell (или ISE);
Рис. 11 – Запуск первого скрипта путём прописывания пути к нему
2 Через контекстное меню файла ps1;
Рис. 12 – Запуск сценария через его контекстное меню
3 Открываем сценарий в PowerShell ISE и жмём F
Рис. 13 – Запуск скриптов из окна PowerShell ISE
Важно, чтобы в пути к файлу отсутствовали пробелы!
PowerShell – мощное средство для упрощения выполнения рутинных операций в Windows 7, Server 2008 и более новых
Важное достоинство PowerShell – скрипты и наличие версии программы с графическим интерфейсом PS ISE. Команды в ней представлены в виде командлетов, что сделает возможным ознакомление с оболочкой и понимание смысла каждой команды
Политика безопасности не даст новичку навредить своему компьютеру полученными из неизвестных источников скриптами, а режим отладки, создание собственных командлетов, функций и механизм обработки ошибок открывают перед программистами и администраторами неограниченные возможности.
https://youtube.com/watch?v=fyWFIn4lF6c
Создание
Представим, что каждое утро вы проверяете 50 последних логов за 14 часов журнала Application с помощью этой команды:
Get-EventLog -LogName Application -Newest 50 | where TimeWritten -ge (Get-Date).AddHours(-14)
Команда не очень сложная, но в скором времени ее надоест писать. Для сокращения этой работы ее можно выделить в отдельную функцию:
Function Get-DayLog {
Get-EventLog -LogName Application -Newest 50 | where TimeWritten -ge (Get-Date).AddHours(-14)
}
Любая функция обязательно должна состоять из трех вещей:
- function — объявляет и говорит что после нее будет название;
- имя функции — название, по которому мы будем ее вызывать. В нашем случае имя Get-DayLog;
- скобки — обозначают начало и конец выражения.
После написания функции она вызывается по имени:
Get-DayLog
Учитывая, что нам может потребоваться получить данные не за последние 14 часов и более чем за 50 дней нам может потребуется изменить ее передав параметры.