PowerShell · 01.02.2023

Вам пришло msg

Бывают ситуации, когда просто необходимо отправить пользователю удалённого хоста какое-то информационное сообщение. Обычно для этого используется электронная почта. А что делать, если почты у пользователя нет и никогда не было?

В таких ситуациях можно взять на вооружение утилиту msg. Она по умолчанию присутствует в составе ОС, обозначенной в тегах.

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

## Заголовок окна консоли ##
[System.Console]::Title = "Отправка сообщения на удалённый хост"

## Блок переменных ##
$hostname = Read-Host 'Имя компьютера'
$message = Read-Host 'Сообщение'

## Проверка доступности хоста ##
$ping = Test-Connection -ComputerName $hostname -Quiet -Count 1

## Отправка сообщения ##
if ($ping) { msg * /server:$hostname "$message" }
else { Write-Host "Удалённый хост $hostname не доступен!" -ForegroundColor Red }

Логика проста: вводим нужные данные (имя хоста и текст сообщения), проверяем доступность хоста и если он пингуется — отправляем сообщение. У скрипта нет проверки на пустоту переменных — поэтому воздержитесь от null значений.

Тестировалось в рамках домена, где были включены и PowerShell Remote, и WinRM. Для работы в условиях локальной сети рабочей группы необходимо поменять в реестре значение ключа AllowRemoteRPC на 1 по пути, указанному ниже.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"AllowRemoteRPC"=dword:00000001

Из этой конструкции можно сделать reg-файл и автоматизировать изменение ключа.

Не рекомендую с помощью данного скрипта отправлять сообщение пользователю терминальной фермы, так как окно с посланием выскочит сразу у всех пользователей. Использование данного метода в рамках терминальной фермы будет оправдано, если Вы хотите предупредить пользователей о каком-то глобальном событии: о запланированной перезагрузке, об обновлении ПО или о дне рождения админа…