PowerShell on-screen alerts and popup boxes: Add them to your scripts

Getting attention with powershell on-screen alerts

This approach works fine in nominal situations, but imagine what would happen if the script encountered a problem. Because the IT staff is likely to be busy with other things, they are likely to assume that the script is working just like it always has, and therefore ignore the log file. What the script really needs is a way of getting someone’s attention in real-time.

There are several different ways of accomplishing this. One option, for example, is to design the script to send email alerts whenever necessary. A simpler option, however, is to generate PowerShell on-screen alerts by using popup messages. Let me show you how it’s done.

Msg – отправка сообщения по локальной сети.

Команда MSG существовала еще в Windows 2000/XP и предназначалась для обмена
сообщениями между пользователями вошедшими в систему локально и пользователями терминальных сессий ( подключившихся к удаленному рабочему столу ) .
В Windows Vista и более поздних операционных системах семейства Windows команда MSG стала основным стандартным средством обмена сообщениями, поскольку команда net send в данных ОС больше не поддерживается.

Формат командной строки:

MSG {пользователь | имя сеанса | ID сеанса | @имя файла | *} [/SERVER:сервер] [/TIME:секунд] [/V] [/W] [сообщение]

Описание параметров командной строки :

пользователь – Имя пользователя.
имя сеанса – Имя сеанса.
ID сеанса – Идентификатор сеанса.
@имя файла – Файл, содержащий список имен пользователей, сеансов или идентификаторов сеансов, которым отправляется сообщение.
* – Отправить сообщение всем сеансам на указанном сервере.
/SERVER:сервер – Сервер (по умолчанию – текущий).
/TIME:секунд – Интервал ожидания подтверждения от получателя.
/V – Отображение информации о выполненных действиях.
/W – Ожидание ответа от пользователя, полезно вместе с /V.
сообщение – Отправляемое сообщение. Если не указано, выдается запрос или принимается ввод из STDIN.

Важно!

Нынешняя реализация msg.exe прекрасно подходит для обмена сообщениями между сеансами
локальных и терминальных пользователей в пределах одной системы, однако, в случаях обмена между разными компьютерами локальной сети,
потребуется изменить некоторые настройки безопасности, принятые по умолчанию в операционных системах Windows Vista, 7 и более поздних.

При стандартных настройках, отправка сообщения пользователям удаленных компьютеров не выполняется и сопровождается сообщением:

Ошибка 1722 при получении имен сеанса

Это означает, что на компьютере, где должно приниматься посылаемое сообщение, невозможно получить информацию о
вошедших в систему пользователях. Причиной может быть то, что брандмауэр блокирует входящие соединения, недостаточны
права пользователя по отношению к удаленной системе, запрет удаленного вызова процедур в параметрах службы сервера терминалов.
Как минимум, для обмена сообщениями с использованием команды msg между компьютерами, необходимо иметь учетную запись
пользователя, действительную по отношению к удаленной системе и выполнить следующие настройки:

  • на каждом компьютере, которому будут отправляться сообщения, добавить в раздел реестра

    HKLMSYSTEMCurrentControlSetControlTerminal Server

    параметр AllowRemoteRPC типа REG_DWORD и равный 1
    Для изменения настроек можно использовать .reg-файл следующего содержания:


    Windows Registry Editor Version 5.00
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal Server]“AllowRemoteRPC”=dword:00000001

    В ОС Windows Vista, Windows 7, 8, 10 ключ реестра AllowRemoteRPC существует, но имеет значение равное , что необходимо исправить. Для применения изменений требуется перезагрузка.

  • поскольку для обмена сообщениями утилита msg.exe использует протокол SMB (Server Message Block ), на каждом компьютере, которому будут
    отправляться сообщения, должен быть открыт TCP порт 445

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

    msg * /server:Server “Тестовое сообщение ” – отправить тестовое сообщение всем пользователям компьютера Server

    msg * /server:192.168.0.1 “Тестовое сообщение ” – отправить тестовое сообщение всем пользователям компьютера с IP-адресом 192.168.0.1

    msg RDP-Tcp#0 /server:TSServer “Тестовое сообщение” – отправить тестовое сообщение пользователю терминальной сессии с именем RDP-Tcp#0 на компьютере TSServer

    msg console /server:Windows7 “Тестовое сообщение” – отправить тестовое сообщение текущему локальному пользователю компьютера Windows7

    msg console “Тестовое сообщение” – отправка тестового сообщения от пользователя сеанса RDP локальному пользователю. Если эта команда выполняется не пользователем
    терминальной сессии, то сообщение будет отправлено локальным пользователем самому себе.

    Для выполнения команды msg от имени другого пользователя можно воспользоваться утилитой PSExec из пакета PSTools или штатным средством runas.exe

    psexec -u otheruser -p otherpass msg * /server:win10 TEST message

    :/>  PCMflash – купить в ECUTools

    runas /user:otheruser “msg * /server:win10 Test message”

    Сообщения, отправляемые командой msg локальному пользователю компьютера с операционной системой Windows XP, который отсутствует ( еще не вошел в Windows ) отображаются
    в окне с приглашением к регистрации в системе и могут быть доступны посторонним.

    Весь список команд CMD Windows

    Powershell и gui. это — не сложно

    Некоторое время назад в компании была развернута терминальная ферма.

    Первым делом в неё были выселены пользователи некой желтой программы.

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

    XaocCPS

    посоветовал мне играться в сторону WPF. Нужный скрипт был написан, но его работой я неудовлетворился:

    1. Надо ставить внешний компонент PowerShellPack.

    2. Компонент ставиться на сервера фермы (х64) отказался.

    3. Распространять такое решение из за пункта 1 всем желающим не очень удобно.

    Xaegr подсказал что я могу избавиться от прослойки WPF.
    Писать можно, можно даже писать красиво. Скрипт выполняется везде где есть .Net Framework — XP, Win7 и скорее всего пойдет даже на х64 серверах фермы.
    Как писать — под катом.

    UPD по просьбам скрипт выложен на SkyDrive, ссылка в конце

    И так — ТЗ, полученное от отдела поддержки было «отправка сообщений всем пользователям терминальной фермы».
    Мною ТЗ было расширено:
    1. Выбор серверов.
    2. Выбор пользователей.
    3. Ввод текста сообщения.
    4. Вставка подписи — идентификатор отправившего сообщения пользователя — виден в заголовке окна, но на него внимание обращают мало, выбрал вариант из нескольких предустановленных вариантов.
    5. Защита от нечаянной отправки.

    Предварительно было найдено, что в Win7 и 2008* есть команда msg, с помощью которой данные сообщения и будут отправляться, но прием сообщений надо разрешить, что и сделал простеньким regedit файлом:

    Windows Registry Editor Version 5.00
    [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal Server]"AllowRemoteRPC"=dword:00000001

    К сожалению, если пользователь из списка не подключен к серверу — скрипт много и сильно ругается. Я пока не придумал как получить вывод msg, и его обрабатывать.
    Скрипт по максимуму комментирован.
    ~15kb

    # Подключаем то, с помощью чего будем рисовать нашу форму
    Add-Type -assembly System.Windows.Forms
    
    	# Все просто, массивы из списка серверов, списка пользоватей, и варианты подписи - чтобы использовать могла не только поддержка.
    	$Server        = @("rdp1-1, rdp1-2, rdp1-3, rdp1-4", "rdp2-1, rdp2-2, rdp2-3, rdp2-4")
    	$User          = @("*", "1c-admin1, 1c-admin2")
    	$Message       = "Умолчательное сообщение"
    	# По хорошему, надо бы сделать так, чтобы если умолчательное сообщение не менялось и шло нажатие на кнопку отправить, то выводилось бы предупреждение.
    	# Так же по аналогии с тем что есть, тут тоже можно повесить список со стандартными сообщениями
    
    	# Подписываемся
    	$Sign          = @("С уважением, администраторы 1С", "С уважением, системные администраторы")
    
    	# Повелось, что все функции описываются до их использования.
    	# Функция отправки сообщения. Принимаем параметры, проверяем, если чекбокс включен (а он включен по умолчанию), устанавливаем параметры отправки только на консоль локалхоста, иначе проходим по списку серверов, внутри каждого сервера инициируем цикл по списку пользователей с предварительно отрезанными пробелами до и после текста(помните формат: "сервер1, сервер2, сервер3" для красивой читаемости текста), вызываем сам msg для отправки сообщения и после чего вызываем диалогов окно с подтверждением отправки и закрытием программы.
    Function SendMessage {
            param ($Server, $User, $Message, $Sign)
           # Write-Host $Server, $User, $Message, $Sign
            If ($TestRunCheckBox.Checked -eq 1 ) { Write-Host $TestRunCheckBox.Checked; $Server="localhost"; $User = "Console" }
            ForEach ($Item in $Server) {
                ForEach ($UserX in $User) {
                        $UserTrim = $UserX.Trim()
                        $ServerTrim = $Item.Trim()
                        $MsgTrim = $Message.Trim()
                        $SignTrim = $SignX.Trim()
                        # Отладочный вывод, оставлен на всякий случай.
                        # Write-Host "User: $UserTrim; Server: $ServerTrim; Message: $MsgTrim; Signature: $SignTrim"
                        c:windowssystem32msg.exe $UserTrim /Server:$ServerTrim $MsgTrim $SignTrim
                    }
            }
         Confirm
        }
    
    # Вывод окна с подтверждением
    Function Confirm {
            $ConfirmWin = New-Object System.Windows.Forms.Form
            $ConfirmWin.StartPosition  = "CenterScreen"
            $ConfirmWin.Text = "Подтверждение отправки"
            $ConfirmWin.Width = 200
            $ConfirmWin.Height = 120
            $ConfirmWin.ControlBox = 0
    
            $ConfirmWinOKButton = New-Object System.Windows.Forms.Button
            $ConfirmWinOKButton.add_click({ $MainSendWindow.Close(); $ConfirmWin.Close() })
            $ConfirmWinOKButton.Text = "Закрыть"
            $ConfirmWinOKButton.AutoSize = 1
            $ConfirmWinOKButton.Location        = New-Object System.Drawing.Point(50,50)
    
            $ConfirmLabel = New-Object System.Windows.Forms.Label
            $ConfirmLabel.Text = "Сообщение было отправлено"
            $ConfirmLabel.AutoSize = 1
            $ConfirmLabel.Location  = New-Object System.Drawing.Point(10,10)
    
            $ConfirmWin.Controls.Add($ConfirmLabel)
            $ConfirmWin.Controls.Add($ConfirmWinOKButton)
            $ConfirmWin.ShowDialog() | Out-Null
        }
    
    # Главное окно, по хорошему тоже стоило бы оформить в виде функции
         $MainSendWindow                = New-Object System.Windows.Forms.Form
         $ToolTip = New-Object System.Windows.Forms.ToolTip
    
         $ToolTip.BackColor = [System.Drawing.Color]::LightGoldenrodYellow
         $ToolTip.IsBalloon = $true
         # $ToolTip.InitialDelay = 500
         # $ToolTip.ReshowDelay = 500
    
         # Инициализация контролов формы
         # Кнопки и чекбокс
         $SendButton                   = New-Object System.Windows.Forms.Button
         $CloseButton                   = New-Object System.Windows.Forms.Button
         $TestRunCheckBox           = New-Object System.Windows.Forms.CheckBox
    
         # Текстовые поля и списки
         $ServerTextBox                = New-Object System.Windows.Forms.ComboBox
         $UserTextBox                   = New-Object System.Windows.Forms.ComboBox
         $MessageTextBox             = New-Object System.Windows.Forms.TextBox
         $SignTextBox                   = New-Object System.Windows.Forms.ComboBox
    
         # Подписи
         $ServerTextBoxLabel           = New-Object System.Windows.Forms.Label
         $UserTextBoxLabel              = New-Object System.Windows.Forms.Label
         $MessageTextBoxLabel        = New-Object System.Windows.Forms.Label
         $SignTextBoxLabel              = New-Object System.Windows.Forms.Label
    
    # Описываем свойства (комментариями я еще добавлю несколько нагугленных
    # интересных свойств для общего развития и чтобы далеко не бегать ;))
    
    # Главная форма
    $MainSendWindow.StartPosition  = "CenterScreen"
    $MainSendWindow.Text           = "Отправка сообщения пользователям"
    $MainSendWindow.Width          = 470
    $MainSendWindow.Height         = 220
    # несколько плюшек и обещанных красивостей
    #$Win.ControlBox           = 0 # отключить кнопки свернуть, минимизацию и закрытие.
    # $Win.ShowIcon             = 0
    # $Win.ShowInTaskbar        = 0
    # $Win.HelpButton           = 1
    # авторазмер может отрабатывать если вся форма - к примеру одна кнопка "Сделать хорошо"
    # $Win.Autosize             = 1
    # $Win.AutoSizeMode         = "GrowAndShrink"
    # стиль обрамления и шрифт.
    # $Win.FormBorderStyle      = [System.Windows.Forms.FormBorderStyle]::Fixed3D
    # $Win.Font                 = New-Object System.Drawing.Font("Verdana",32)
    
    # Подписи к текстовым полям
    $ServerTextBoxLabel.Location   = New-Object System.Drawing.Point(10,12)
    $ServerTextBoxLabel.Text       = "Список серверов"
    $ServerTextBoxLabel.Autosize     = 1
    
    $UserTextBoxLabel.Location     = New-Object System.Drawing.Point(10,42)
    $UserTextBoxLabel.Text         = "Список пользователей"
    $UserTextBoxLabel.Autosize     = 1
    
    $MessageTextBoxLabel.Location  = New-Object System.Drawing.Point(10,73)
    $MessageTextBoxLabel.Text      = "Сообщение"
    $MessageTextBoxLabel.Autosize  = 1
    # Плюшка в виде красивой подсказки, делается другим методом вызова, поэтому идет к каждому обьекту в блоке, чтобы не теряться.
    $ToolTip.SetToolTip($MessageTextBoxLabel, "Надо подписаться, а то в заголовке окна с сообщениями не видно")
    
    $SignTextBoxLabel.Location     = New-Object System.Drawing.Point(10,103)
    $SignTextBoxLabel.Text         = "Подпись"
    $SignTextBoxLabel.Autosize     = 1
    $ToolTip.SetToolTip($SignTextBoxLabel, "Надо подписаться, а то в заголовке окна с сообщениями не видно")
    
    # Описание текстбокса
    # Позиция
    $ServerTextBox.Location        = New-Object System.Drawing.Point(140,10)
    # Источник данных
    $ServerTextBox.DataSource      = $Server
    # Размер
    $ServerTextBox.Width           = 300
    # Обработка события - при смене текста в поле, присваиваем переменной новое полученное значение.
    $ServerTextBox.add_TextChanged({ $Server = $ServerTextBox.Text })
    # индекс порядка перехода по Tab
    $ServerTextBox.TabIndex        = 1
    $ToolTip.SetToolTip($ServerTextBox, "Укажите список серверов")
    
    $UserTextBox.Location          = New-Object System.Drawing.Point(140,40)
    $UserTextBox.DataSource        = $User
    # Не забываем про массив
    $UserTextBox.Text              = $User[1]
    $UserTextBox.add_TextChanged({ $User = $UserTextBox.Text })
    $UserTextBox.Width             = 300
    $UserTextBox.TabIndex          = 2
    $ToolTip.SetToolTip($UserTextBox, "Кому отправлять будем? (* для *всех* пользователей, по умолчанию)")
    
    # Поле сообщения
    $MessageTextBox.Location       = New-Object System.Drawing.Point(140,70)
    $MessageTextBox.Text           = $Message
    # По клику в поле ввода - автоматически выделяем весь текст, чтобы не надо было
    # нажимать удаление
    $MessageTextBox.add_click({ $MessageTextBox.SelectAll() })
    $MessageTextBox.add_TextChanged( { $Message = $MessageTextBox.Text })
    $MessageTextBox.Width          = 300
    $MessageTextBox.TabIndex       = 3
    $ToolTip.SetToolTip($MessageTextBox, "И шо мы таки хотим сказать?")
    
    # Поле подписи - отправляемая переменная уже другая
    $SignTextBox.Location          = New-Object System.Drawing.Point(140,103)
    # Источник текста для подписи
    $SignTextBox.DataSource        = $Sign
    # А мы помним, что там массив?:)
    $SignTextBox.Text              = $Sign[1]
    $SignTextBox.add_TextChanged({ $SignX = $SignTextBox.Text })
    $SignTextBox.Width             = 300
    $SignTextBox.TabIndex          = 4
    $ToolTip.SetToolTip($SignTextBox, "Страна должна знать своих героев")
    
    # Нопка отправки.
    $SendButton.Location           = New-Object System.Drawing.Point(10,150)
    $SendButton.Text               = "Отправить сообщение"
    # Выполняем разделения строк на массивы с разделителем запятая, вызываем функцию отправки сообщения
    $SendButton.add_click({ $User  = $UserTextBox.Text.Split(","); $Server = $ServerTextBox.Text.Split(","); $SignX = $SignTextBox.Text; SendMessage $Server $User $Message $SignX} )
    $SendButton.Autosize           = 1
    $SendButton.TabIndex           = 5
    $ToolTip.SetToolTip($SendButton, "Тыцни пимпочку")
    
    # Прописываем блокировочный чекбокс
    $TestRunCheckBox.Location      = New-Object System.Drawing.Point(200,150)
    $TestRunCheckBox.Text          = "Тест"
    $TestRunCheckBox.Checked       = 1
    $TestRunCheckBox.AutoSize      = 1
    $TestRunCheckBox.TabIndex      = 6
    $ToolTip.SetToolTip($TestRunCheckBox, "Сними меня, а то работать не будет")
    
    # Кнопочка выхода, по событию вызывает метод закрытия
    $CloseButton.Location          = New-Object System.Drawing.Point(315,150)
    $CloseButton.Text              = "Выйти из программы"
    $CloseButton.add_click({ $MainSendWindow.Close() })
    $CloseButton.Autosize          = 1
    $CloseButton.TabIndex          = 7
    $ToolTip.SetToolTip($CloseButton, "Пойдем ка отсюда")
    
    
    # Добавляем контролы в форму и вызываем её запуск
    $MainSendWindow.Controls.Add($SendButton)
    $MainSendWindow.Controls.Add($TestRunCheckBox)
    $MainSendWindow.Controls.Add($CloseButton)
    
    $MainSendWindow.Controls.Add($ServerTextBox)
    $MainSendWindow.Controls.Add($UserTextBox)
    $MainSendWindow.Controls.Add($MessageTextBox)
    $MainSendWindow.Controls.Add($SignTextBox)
    
    $MainSendWindow.Controls.Add($ServerTextBoxLabel)
    $MainSendWindow.Controls.Add($UserTextBoxLabel)
    $MainSendWindow.Controls.Add($MessageTextBoxLabel)
    $MainSendWindow.Controls.Add($SignTextBoxLabel)
    
    $MainSendWindow.ShowDialog() | Out-Null
    

    В результате получилась вот такая вот красивость
    image

    :/>  Почему Windows 10 не видит жесткий диск?

    Скрипт могу выложить, при желании читателей, куда-то.

    Не уверен, что хватит кармы публировать в профильный, поэтому выложил сюда

    Исходник скрипта на GitHub’е

    Использование утилиты msg.exe на примере отправки сообщения терминальным пользователям в os windows server 2008

    В этом примере из командной строки (cmd.exe) я отправил сообщение test1 терминальному пользователю с именем Администратор. Если бы заменил названия пользователя и указал бы команду msg * test1, то сообщение передалось бы всем пользователям терминального сервера.

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

    Например, если вам необходимо в течении дня два-три раза сообщить пользователям 1С о необходимости закрыть программу. К сожалению, при использовании командной строки, русские шрифты могут отображаться некорректно, поэтому могу предложить в качестве решения проблемы 2 варианта:

    • Вариант отправки каждому пользователю по отдельности (если их конечно достаточно малое количество).

    Для этого вызываем диспетчер задач, находясь в окне терминала или непосредственно на самом сервере (ctrl shift esc), переходим на вкладку «Пользователи», выделяем нужного нам и правой кнопкой мыши выбираем пункт «Отправить сообщение».

    • Этот вариант подразумевает работу в командной строке с использованием Windows PowerShell.

    Команды пишутся по тому же принципу, как и в cmd.exe, но здесь есть простая настройка отображения шрифтов (правой кнопкой мышки в верхнем левом углу и выбор пункта «Свойства»)

    Переходим на вкладку «Шрифт» и меняем значение на LucidaConsole

    Теперь шрифты кириллицы будут отображаться корректно.

    На этом пока все, что я хотел рассказать вам сегодня. Спасибо, что читали.

    Параметры msg.exe

    пользователь

    — Имя пользователя
    :/>  ТОП 7 лучших сборок кодеков для Windows

    имя сеанса — Имя сеанса

    ID сеанса — Идентификатор сеанса

    @имя файла — Файл, содержащий список имен пользователей, сеансов или идентификаторов сеансов, которым отправляется сообщение

    * — Отправить сообщение всем сеансам на указанном сервере

    /SERVER:сервер — Сервер (по умолчанию — текущий)

    /TIME:секунд — Интервал ожидания подтверждения от получателя

    /V — Отображение информации о выполненных действиях

    /W — Ожидание ответа от пользователя, полезно вместе с /V

    сообщение — Отправляемое сообщение. Если не указано, выдается запрос или принимается ввод из STDIN

    /? — Показывает справку

    Синтаксис msg.exe

    MSG {пользователь | имя сеанса | ID сеанса | @имя файла | *}
        [/SERVER:сервер] [/TIME:секунд] [/V] [/W] [сообщение]

    Вывод уведомлений пользователям с помощью powershell | windows для системных администраторов

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

    Самый простой способ вывести окошко с произвольным тестом через подсистему сценариев Windows – Wscript.

    Следующий код выведет обычное текстовое окно с необходимым текстом и кнопкой OK.

    $wshell = New-Object -ComObject Wscript.Shell
    $Output = $wshell.Popup("Скрипт формирования отчета выполнен")

    Wscript.Shell вывод уведомлений в POwershell

    С помощью различных свойств метода Popup вы можете настроить вид модального окна сообщения. В том числе можно вернуть в скрипт результаты ответа пользователя на вопрос (Да / Нет).

    $wshell.Popup

    $Output = $wshell.Popup("Скрипт формирования отчета завершен! Хотите вывести его на экран?",0,"Отчет готов",4 32)

    Общий синтаксис и параметры метода Popup:

    Popup(<Text>,<SecondsToWait>,<Title>,<Type>)

    Параметры:

    • <Text> — строка, текст сообщения.
    • <SecondsToWait> — необязательный, число. Количество секунд, по истечении которого окно будет автоматически закрыто.
    • <Title> — необязательный, строка. Текст заголовка окна сообщения.
    • <Type> — необязательный, число. Комбинация флагов, определяет тип кнопок и значка. Возможные значения флагов:
      • 0 — кнопка ОК.
      • 1 — кнопки ОК и Отмена.
      • 2 — кнопки Стоп, Повтор, Пропустить.
      • 3 — кнопки Да, Нет, Отмена.
      • 4 — кнопки Да и Нет.
      • 5 — кнопки Повтор и Отмена.
      • 16 — значок Stop.
      • 32 — значок Question.
      • 48 — значок Exclamation.
      • 64 — значок Information.

    Описание: возвращает целое значение, с помощью которого можно узнать, какая кнопка была нажата пользователем. Возможные значения:

    • -1 — таймаут.
    • 1 — кнопка ОК.
    • 2 — кнопка Отмена.
    • 3 — кнопка Стоп.
    • 4 — кнопка Повтор.
    • 5 — кнопка Пропустить.
    • 6 — кнопка Да.
    • 7 — кнопка Нет.

    Более привлекательные и приятные взгляду всплывающие сообщения (ballons) можно вывести в Windows 7, 8.1 и 10 через API Windows Forms. Следующий PowerShell код выведет всплывающее сообщение рядом с панелью уведомлений Windows 10, которое автоматически исчезнет через 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)

    всплывающее уведомление в POwerShell

    Кроме того для создания красочных всплывающих сообщений в Windows 10 (PowerShell 5.0 )можно использовать отдельный PowerShell модуль BurntToast из галереи PowerShell.

    Модуль устанавливается из онлайн репозитория с помощью менеджера пакетов Windows 10:
    Install-Module -Name BurntToast

    Теперь, например, в ранее рассматриваемый скрипт автоматического отключение от Wi-FI сети при подключении к Ethernet можно добавить красочное уведомление:

    New-BurntToastNotification -Text "Отключение от Wi-Fi сети", "Вы были отключены от Wi-Fi сети, т.к. Вше устройство было подключено к скоростному Ethernet подключению." -AppLogo C:PSchangenetwork.png

    Итак, теперь вы знаете как вывести уведомление пользователя через PowerShell. Если у пользователя есть динамики, можно даже сыграть ему мелодию:

    [console]::beep(440,500)
    [console]::beep(440,500)
    [console]::beep(440,500)
    [console]::beep(349,350)
    [console]::beep(523,150)
    [console]::beep(440,500)
    [console]::beep(349,350)
    [console]::beep(523,150)
    [console]::beep(440,1000)
    [console]::beep(659,500)
    [console]::beep(659,500)
    [console]::beep(659,500)
    [console]::beep(698,350)
    [console]::beep(523,150)
    [console]::beep(415,500)
    [console]::beep(349,350)
    [console]::beep(523,150)
    [console]::beep(440,1000)
    [console]::beep(880,500)
    [console]::beep(440,350)
    [console]::beep(440,150)
    [console]::beep(880,500)
    [console]::beep(830,250)
    [console]::beep(784,250)
    [console]::beep(740,125)
    [console]::beep(698,125)
    [console]::beep(740,250)
    [console]::beep(455,250)
    [console]::beep(622,500)
    [console]::beep(587,250)
    [console]::beep(554,250)
    [console]::beep(523,125)
    [console]::beep(466,125)
    [console]::beep(523,250)
    [console]::beep(349,125)
    [console]::beep(415,500)
    [console]::beep(349,375)
    [console]::beep(440,125)
    [console]::beep(523,500)
    [console]::beep(440,375)
    [console]::beep(523,125)
    [console]::beep(659,1000)
    [console]::beep(880,500)
    [console]::beep(440,350)
    [console]::beep(440,150)
    [console]::beep(880,500)
    [console]::beep(830,250)
    [console]::beep(784,250)
    [console]::beep(740,125)
    [console]::beep(698,125)
    [console]::beep(740,250)
    [console]::beep(455,250)
    [console]::beep(622,500)
    [console]::beep(587,250)
    [console]::beep(554,250)
    [console]::beep(523,125)
    [console]::beep(466,125)
    [console]::beep(523,250)
    [console]::beep(349,250)
    [console]::beep(415,500)
    [console]::beep(349,375)
    [console]::beep(523,125)
    [console]::beep(440,500)
    [console]::beep(349,375)
    [console]::beep(261,125)
    [console]::beep(440,1000)

    Оставьте комментарий

    Adblock
    detector