Для оповещения пользователей о различных событиях, вы можете выводить различные графические уведомления из скриптов PowerShell. В PowerShell можно использовать всплывающие уведомления в трее Windows или модальные окно для получения информации от пользователя или подтверждения действия.
Вывести всплывающее сообщение на экран с помощью PowerShell
Для вывода простых модального диалогового окна в Windows можно воспользоваться Wscript классами подсистемы сценариев Windows. Следующий PowerShell код выведет обычное текстовое окно с вашим текстом и кнопкой OK.
$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup("Скрипт формирования отчета выполнен")
Вы можете настроить вид модального окна такого сообщения и добавить кнопки действия для пользователей. Например, чтобы вывести всплывающее окно с кнопками Да и Нет, выполните:
$Output = $wshell.Popup("Скрипт формирования отчета завершен! Хотите вывести его на экран?",0,"Отчет готов",4+32)
Если пользователь нажмет Да, команда вернет значение
6
, а если Нет –
7
.
В зависимости от выбора пользователя вы можете выполнить какое-то действие, или завершить скрипт.
switch ($Output) { 7 {$wshell.Popup('Нажата Нет')} 6 {$wshell.Popup('Нажата Да')} default {$wshell.Popup('Неверный ввод')} }
Общий синтаксис и параметры метода Popup:
Popup(<Text>,<SecondsToWait>,<Title>,<Type>)
Параметры:
- <Text> — текст сообщения.
- <SecondsToWait> — необязательный, число. Количество секунд, по истечении которого окно будет автоматически закрыто.
- <Title> — текст заголовка окна сообщения (необязательный параметр).
- <Type> — комбинация флагов, определяет тип кнопок и вид значка (числовое значение, не обязательный параметр). Возможные значения флагов:
- 0 — кнопка ОК.
- 1 — кнопки ОК и Отмена.
- 2 — кнопки Стоп, Повтор, Пропустить.
- 3 — кнопки Да, Нет, Отмена.
- 4 — кнопки Да и Нет.
- 5 — кнопки Повтор и Отмена.
- 16 — значок Stop.
- 32 — значок Question.
- 48 — значок Exclamation.
- 64 — значок Information.
Команда PowerShell возвращает целое значение, с помощью которого можно узнать, какая кнопка была нажата пользователем. Возможные значения:
- -1 — таймаут.
- 1 — кнопка ОК.
- 2 — кнопка Отмена.
- 3 — кнопка Стоп.
- 4 — кнопка Повтор.
- 5 — кнопка Пропустить.
- 6 — кнопка Да.
- 7 — кнопка Нет.
Если нужно показать пользователю окно ввода и запросить данные, воспользуйтесь классом Windows Forms.
Add-Type -AssemblyName System.Windows.Forms
$input = [Microsoft.VisualBasic.Interaction]::InputBox("Введите имя пользователя:", "Запрос данных", "")
Чтобы обработать введенные пользователе данные:
if ([string]::IsNullOrWhiteSpace($input)) { Write-Host "Данные не указаны" } else { Write-Host "Вы ввели $input" }
Если нужно вывести всплывающее окно поверх всех окон, используйте команду:
($ModalTop = New-Object 'System.Windows.Forms.Form' ).TopMost = $True
[System.Windows.Forms.MessageBox]::Show($ModalTop,"Текст", "Заголовок", 4, 48)
Вывести уведомление пользователю Windows из скрипта PowerShell
С помощью класса Windows Forms можно вывести более красивые всплывающие сообщения (ballons). Следующий скрипт выведет всплывающее сообщение рядом с панелью уведомлений Windows, которое автоматически исчезнет через 10 секунд:
Add-Type -AssemblyName System.Windows.Forms
$global:balmsg = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balmsg.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
$balmsg.BalloonTipText = 'Это текст всплывающего сообщения для пользователя Windows 10'
$balmsg.BalloonTipTitle = "Внимание $Env:USERNAME"
$balmsg.Visible = $true
$balmsg.ShowBalloonTip(10000)
Для создания красочных всплывающих сообщений в Windows можно использовать отдельный PowerShell модуль BurntToast.
Установите модуля из PowerShell Gallery:
Install-Module -Name BurntToast
Теперь, например, в ранее рассматриваемый скрипт автоматического отключения от Wi-FI сети при подключении к Ethernet можно добавить уведомление с картинкой:
New-BurntToastNotification -Text "Отключение от Wi-Fi сети", "Вы были отключены от Wi-Fi сети, т.к. Вше устройство было подключено к скоростному Ethernet подключению." -AppLogo C:\PS\changenetwork.png
PowerShell: отправка сообщения пользователю на удаленный компьютер
С помощью PowerShell вы можете отправить всплывающее сообщение пользователю на удаленный компьютер. Сначала нужно получить список сессии пользователей на удаленном компьютере (в случае RDS сервера):
qwinsta /server:rds1
Чтобы отправить сообщение в сессию пользователя на удаленном компьютер, выполните команду:
MSG kbuldogov /server:rds1 "Сервер будет перезагружен через 10 минут. Закройте документы"
Если всплывающее сообщение нужно отправить всем пользователям укажите * вместо имени пользователя:
MSG * /server:rds1 "Срочное сообщение всем! "
Для отправки всплывающего графического уведомления на удаленный компьютер можно воспользоваться скриптом RemoteSendToasNotification.ps1 из нашего GitHub репозитория ( https://github.com/winadm/posh/blob/master/scripts/RemoteSendToasNotification.ps1). Для подключения к удаленному компьютеру используется командлет Invoke-Command, который использует WinRM.
Спасибо за PoSH музыку, улыбнуло 🙂
Прикольно.
Можно скриптом рассылать уведомления, прям замена net send времен хп 🙂
Как отправить на терминальном сервере, эти сообщение для всех пользователей сразу?
В галерее технета есть скрипт для управления сессиями на терминальных серверах. Только нужно немного подправить «под себя».
msg * Текст
Здравствуйте. у меня к вам вопрос. Как читать эти сообщения в Windows 10. К примеру есть приложение, оно показывает уведомления, например несколько раз в день. Вот мне нужно запускать файл при уведомлении, не важно что там написано, мне нужно открывать все уведомления именно из одного приложения, как можно это сделать? Может не обязательно запускать отдельный файл для запуска, а сделать все одним скриптом? Я не знаю где лежит идентификатор приложений для этих уведомлений. Я бы мог и заплатить, все равно буду обращаться к фрилансерам. Спасибо за любую информацию относящуюся к данному вопросу.
Доброго дня.
Не понял вашу задачу. Вы хотите чтобы ваш powershell скрипт перехватывал сообщения, выводимые в сессию пользователя и как-то их обрабатывал?
А как отправить на удалённый ПК «ballons»?
Так не работает.
New-PSSession -ComputerName PC-name
Invoke-Command -ComputerName PC-name -ScriptBlock {
Add-Type -AssemblyName System.Windows.Forms
$global:balmsg = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balmsg.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
$balmsg.BalloonTipText = 'Это текст всплывающего сообщения для пользователя Windows 10'
$balmsg.BalloonTipTitle = "Внимание $Env:USERNAME"
$balmsg.Visible = $true
$balmsg.ShowBalloonTip(10000)
}
Через Invoke-Command тоже.
$cred = Get-Credential
$s = New-PSSession -ComputerName PC-Name -Credential $cred
Invoke-Command -Session $s -FilePath C:\Scripts\ballons.ps1
Еще бы опубликовать как пользователю голосом передать произвольное сообщение (через синтезатор голоса).
Воспроизвести текст через встроенный синтезатор голоса Windows10 (используется текущий голос синтезатора речи):
Add-Type –AssemblyName System.Speech
$SpeechSynthesizer = New-Object –TypeName System.Speech.Synthesis.SpeechSynthesizer
$SpeechSynthesizer.Speak('Закройте программы, сейчас компьютер будет перезагружен')
Надо бы проверять, а то по умолчанию девушка только английский секет)
$SpeechSynthesizer.GetInstalledVoices().VoiceInfo
Ну да )
Уведомления не выводит
Не могу победить такую проблему: в сессии пользователя каждые 10 минут запускается скрипт пингования по расписанию. Так вот синее окно powershell всплывает поверх других окон в самый неподходящий момент. Не смог в настройках расписания сделать окно невидимым или свернутым. Как сделать, чтобы окно скрипта было невидимым?
Запускайте через планировщик так:
PowerShell.exe -windowstyle hidden { тут ваш код }
Не помогает. Всё равно появляется окно повершела на секунду.
Попробуйте это вставить в начало скрипта:
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'
Внимательнее с последним знаком.
Здравствуйте. А как поставить уведомление при печати. Чтобы у пользователя при отправки на печать появлялось окно с подтверждением и количеством отправляемых на печать листов
Можно перхватывать и парсить eventы печати из event viewer и отображать данные из них этим popup скриптом.
Тот же вопрос, как этот скрипт отправить на удаленный ПК ? через Invoke-Command не работает.
Посмотрите на модуль _https://github.com/Windos/BurntToast — он должен стоять на удаленном компьютере
Invoke-Command -ComputerName RemotePC -ScriptBlock {New-BurntToastNotification -Text 'Test'}
и вот еще пример, на api:
_https://smsagent.blog/2019/06/11/just-for-fun-send-a-remote-toast-notification/
приветствую.
есть такая конструкция для вывода уведомления windows —
powershell {
[reflection.assembly]::loadwithpartialname('System.Windows.Forms')
[reflection.assembly]::loadwithpartialname('System.Drawing')
$notify=new-object system.windows.forms.notifyicon
$notify.icon=[System.Drawing.SystemIcons]::Information
$notify.visible=$true
$notify.showballoontip(10,'Defender','Need reboot',[system.windows.forms.tooltipicon]::Warning)
}
можно ли в нижней строке ([system.windows.forms.tooltipicon]::Warning) иконку заменить на свою ссылкой из .dll ?
Заменить стандартную иконку можно так:
$Icon = New-Object system.drawing.icon (".\icon\test.ico")
$notify.Icon = $Icon
каким образом это относится к моему вопросу?
Ни как не запустить из планировщика.
скрипт вылетает. хотя уже паузу добавил.
В СМД powershell.exe -noprofile -executionpolicy bypass -file c:\ps\ShowBalloonTip.ps1
или powershell.exe -executionpolicy bypass -file c:\ps\ShowBalloonTip.ps1
если открыть в редакторе из под пользователя то ошибка.
Add-Type -AssemblyName System.Windows.Forms
Add-Type : Не удается добавить тип. Определение новых типов не поддерживается в этом языковом режиме.
разобралась ‘Это текст всплывающего сообщения для пользователя Windows 10’ кавычки не нравились.
Как заставить из планировщика показывать активному пользователю это сообщение?
и чтоб $balmsg.BalloonTipTitle = «Внимание $Env:USERNAME» показывало имя пользователя а не того от кого запушен скрипт.
Смысл такой что скрипт который запускает установку ПО запускается из под админа а показать сообщение надо пользователю какому не известно только активному.
Нужно сделать, чтобы это задание планировщика запускалось от пользователя. Можно создать задание планировщика для пользователя компьютера с помощью политики https://winitpro.ru/index.php/2022/05/11/zadanie-planirovshhika-gpo/
не очень подходит или я не понимаю.
Скрипт должен запускаться под админом, перед запуском вывести сообщение о начале пользователю .
и в конце что закончил.
Если создать задание потом его надо запустить именно то когорое создано на пользователя.
а потом второе запустить и удались оба.
Доброго времени суток. Помогите, пожалуйста, как сделать чтобы при нажатии кнопки ОК открывалась нужная папка?
$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup(«Пора сделать разминку. Открыть папку?»,0,»Гимнастика»,1+64)
Открыть указанную папку, если нажата ОК:
if ($Output -eq 1) {Invoke-Item 'c:\ps'}
У вас в примере
Не хватает еще одной строчки:
Здравствуйте.
Спасибо за статье.
Почему-то у меня не работает нижеуказанная часть скрипта через планировщик задач ?
$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup(«Скрипт формирования отчета выполнен»)
Куда топить ?