Powershell: отправка всплывающего уведомления зарегистрированному пользователю при работе в качестве локальной системы

Несмотря на то, что PowerShell консольный язык, иногда необходимо из скрипта PowerShell оповестить пользователя об определенном событии или необходимости

Шаг 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
2
3
4
5
6

# Изменяем пользователя и повышаем права запуска

$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
2
3
4
5
6
7

$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
2
3
4

$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 дней нам может потребуется изменить ее передав параметры.

Понравилась статья? Поделиться с друзьями:
Быть в курсе нового
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: