Windows Server: Отправить сообщение пользователям терминального сервера.
Частенько возникает необходимость предупредить пользователей терминального сервера о перезагрузке или технических работах. Проще всего это сделать сообщением, которое отображается по центру экрана в RDP-сессии. В Windows Server 2003/2008 R2 сообщение можно было отправить прямо из диспетчера задач, что на мой взгляд было весьма удобно. В следующих версиях Windows Server эту возможность убрали, но оставили консольную утилиту msg, которая вполне справляется с этой задачей.
1. С помощью диспетчера задач. Подходит для Windows Server 2003/2008 R2.
Диспетчер задач —> Вкладка Пользователи —> ПКМ —> Отправить сообщение.

2. Консольной утилитой msg. Подходит для любой версии Windows Server.
Утилита msg имеет достаточно большой функционал, но лично я обычно пользуюсь всего тремя командами.
Сообщение всем пользователям текущего сервера:
Сообщение конкретному пользователю:
msg ИмяПользователя «Сообщение»
Сообщение пользователю другого сервера в локальной сети:
msg /server:ИмяСервера ИмяПользователя «Сообщение»
По умолчанию сообщение висит 1 минуту. Изменить время ожидания можно ключом /time:времявсекундах. Пример:
msg * /time:3200 «Сообщение»
Заметки сисадмина о интересных вещах из мира IT, инструкции и рецензии. Настраиваем Компьютеры/Сервера/1С/SIP-телефонию в Москве
Отправка сообщения всем пользователям RDS фермы
2020-09-11 · Posted in RDS, Windows Server 2012, Windows Server 2016/2019
Есть такая замечательная утилита командной строки msg. Что хорошо, вы ей можете пользоваться на любом компьютере, хоть на Windows 8.1. Откройте cmd, желательно от имени администратора и просто введите:
У вас появится справка по утилите. Конструкция команды будет такой MSG | | | @ | *> [/SERVER:] [/TIME:] [/V] [/W] []
- Имя пользователя.
- Имя сеанса. Удобно если нужно отправить конкретному сеансу.
- Идентификатор сеанса.
- @ Файл, содержащий список имен пользователей, сеансов или идентификаторов сеансов, которым отправляется сообщение.
- * Отправить сообщение всем сеансам на указанном сервере.
- /SERVER: Сервер (по умолчанию – текущий).
- /TIME: Интервал ожидания подтверждения от получателя.
- /V Отображение информации о выполненных действиях.
- /W Ожидание ответа от пользователя, полезно вместе с /V.
- Отправляемое сообщение. Если не указано, выдается запрос или принимается ввод из STDIN.
Если нужно отправить сообщение всем людям локально с того же сервера, где они работают, то просто введите:
Как отправлять сообщения программой msg.exe?
Windows Server 2012 находится в рабочей группе.
На нем развернут терминальный сервер.
Необходимо, дать возможность пользователю(без админских прав) отправлять сообщений всем пользователям подключенным к терминальному серверу.
Погуглил, нашел, что можно из консоли запускать программу msg.exe.
Программа работает, но сообщение не доходят до пользователей.(нет прав)
Как разрешить отправку сообщений пользователя (без адмниских прав) через программу msg.exe всем пользователям?
- Вопрос задан более трёх лет назад
- 287 просмотров
Отправка сообщения всем пользователям RDS фермы, за минуту

Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В прошлый раз мы с вами научились устанавливать библиотеку VCRUNTIME140.dll в операционных системах Windows. Сегодня я переключу наше внимание с клиентских ОС на серверные. Наверняка многие из обычных людей , а тем более системные администраторы знают, что такое терминальные службы, RDS ферма или удаленный стол (Удаленка). Это уже неотъемлемая часть бизнес процессов, для многих организаций. Бывают ситуации, что вам необходимо оповестить всех пользователей терминального сервера, о необходимости в его обслуживании. По мимо корпоративной почты вы можете, это делать и средствами Windows и сегодня я покажу, как отправить сообщение всем пользователям RDS фермы.
Постановка задачи
Необходимо научиться отправлять сообщение на терминальный стол всем пользователям, кто на нем работает, иметь возможность вводить текст сообщения. Данный функционал, очень полезен, когда у вас зависают пользовательские сессии и вам необходимо перезагрузить сервер, для его восстановления, но так как на нем есть активные сессии, то желательно бы предупредить сотрудников, чтобы они сохранили все свои данные.
Методы отправки сообщения на RDS ферме
- Отправка сообщение, через диспетчер задач
- Отправка сообщения через утилиту командной строки msg
- Отправка сообщения через командлеты PowerShell
Как отправить предупреждение пользователям RDS через диспетчер задач
Во времена терминальных служб на Windows Server 2008 R2, была замечательная возможность массовой отправки сообщений для всех пользователей фермы и делалось, это штатно из диспетчера задач. В 2008R2, когда вы запустите диспетчер задач и перейдете на вкладку «Пользователи», то у вас была возможность выделить их всех, щелкнуть правой кнопкой мыши и из контекстного меню выбрать пункт «Отправить сообщение».

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

В результате все пользователи данного удаленного стола, получат вот такое сообщение в виде всплывающего окна.

Точно так же в Windows Server 2008 R2 вы могли произвести отправку оповещений, через оснастку «Диспетчер служб удаленных рабочих столов»

К сожалению начиная с Windows Server 2012 R2, данную возможность для массовой рассылки из диспетчера задач убрали, вы теперь не можете выделить всех пользователей.
Использование утилиты MSG
У вас появится справка по утилите. Конструкция команды будет такой MSG | | | @ | *> [/SERVER:] [/TIME:] [/V] [/W] []
- Имя пользователя.
- Имя сеанса. Удобно если нужно отправить конкретному сеансу.
- Идентификатор сеанса.
- @ Файл, содержащий список имен пользователей, сеансов или идентификаторов сеансов, которым отправляется сообщение.
- * Отправить сообщение всем сеансам на указанном сервере.
- /SERVER: Сервер (по умолчанию — текущий).
- /TIME: Интервал ожидания подтверждения от получателя.
- /V Отображение информации о выполненных действиях.
- /W Ожидание ответа от пользователя, полезно вместе с /V.
- Отправляемое сообщение. Если не указано, выдается запрос или принимается ввод из STDIN.

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

Вот так, например в Windows Server 2019 выглядит подобное оповещение на RDS ферме.

Для отправки оповещения на удаленный сервер вы должны использовать вот такую конструкцию:
msg * /server:svt2019s01 Пожалуйста сохраните все свои файлы и завершите корректно ваши сессии в программах. Сервер будет перезагружен, через 5 минут С уважением, отдел технической поддержки
Для отправки на несколько серверов, можно использовать вот такое построение команды:
invoke-command -computername computer1, computer2 -scriptblock
Использование связки PowerShell и msg
(Get-ADComputer -SearchBase «OU=Workstations,DC=root,DC=pyatilistnik,DC=org» -Filter *).Name | Foreach-Object
Если у вас выскакивает ошибка «Ошибка 1726 при получении имен сеанса» и сообщение не отправляется, то тут вся загвоздка в том, что у той учетной записи от имени которой открыта командная строка, просто не хватает прав. Вам нужно открыть cmd от имени пользователя у кого есть права на тот сервер.

Третий метод отправки сообщения пользователям RDS через Send-RDUser Message
Безусловно самым популярным и универсальным методом отправки оповещений пользователям удаленного рабочего стола, являются командлеты PowerShell. Одним из таких командлетов выступает Send-RDUser Message.
Справка по командлеты Send-RDUser Message — https://docs.microsoft.com/en-us/powershell/module/remotedesktop/send-rdusermessage?view=win10-ps
Send-RDUserMessage -HostServer «svt2019s01.root.pyatilistnik.org» -UnifiedSessionID 1 -MessageTitle «От отдела технической поддержки» -MessageBody «Сообщение отправлено через Send-RDUser Message. Пожалуйста сохраните все свои файлы и завершите корректно ваши сессии в программах. Сервер будет перезагружен, через 5 минут С уважением, отдел технической поддержки»
- HostServer — Имя RDS сервера
- -UnifiedSessionID — идентификатор сеанса, к сожалению сразу нельзя выбрать всех, обязательно указывать число ( Как определить номер сеанса пользователя, читайте по ссылке)
- -MessageTitle — Текст самого сообщения

Еще есть скрипт от Microsoft инженера https://gallery.technet.microsoft.com/scriptcenter/Send-NetMessage-Net-Send-0459d235
Еще есть возможность воспользоваться скриптом гуляющем по интернету:
$Sessions = Get-TerminalSession -ComputerName «Имя сервера»
ForEach ($Session in $Sessions) Send-RDUserMessage -HostServer $Session.ServerName -UnifiedSessionID $Session.UnifiedSessionID -MessageTitle $MessageTitle -MessageBody $MessageText
>
- 2 скрипт
# $ConnectionBroker - Активный сервер RDCB. Если не указан, будет произведена попытка выявить его автоматически (для этого обязательно чтобы скрипт выполнялся на одном из серверов фермы RDS) # $SessionHostCollection – Имя RD-коллекции в которой нужно вывести сообщение.
$ConnectionBroker = «»
$SessionHostCollection = «Терминал»
$MessageTitle = «От кого)) »
$MessageText = «Текст «
If ($ConnectionBroker -eq «») $HAFarm = Get-RDConnectionBrokerHighAvailability
$ConnectionBroker = $HAFarm.ActiveManagementServer
>
$Sessions = Get-RDUserSession -ConnectionBroker $ConnectionBroker -CollectionName $SessionHostCollection
ForEach ($Session in $Sessions) Send-RDUserMessage -HostServer $Session.ServerName -UnifiedSessionID $Session.UnifiedSessionID -MessageTitle $MessageTitle -MessageBody $MessageText
>
Подробнее на https://blog.it-kb.ru/2013/11/15/remote-desktop-services-send-message-to-all-active-rds-farm-users-via-powershell
Кстати если вы неправильно развернули RDS ферму, то при выполнении скрипта получите сообщение
Get-RDUserSession : На svt2019s01.root.pyatilistnik.org не развернуты службы удаленных рабочих столов. Эту операцию можно выполнить после их развертывания. Для получения дополнительных сведений.

На этом у меня все. Мы рассмотрели несколько методов по массовой отправке сообщений пользователям удаленных рабочих столов. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.
Популярные Похожие записи:
Как открыть PowerShell, все методы
Как приостановить диспетчер задач- Автозагрузка в windows server 2012-2016
Теневое подключение RDP (Shadow), секреты и настройка- Решено: Error 1061 The service cannot accept control messages at this time
- Ошибка someone is currently logged into the APC