Как отправить сообщение всем пользователям терминального сервера windows server 2016

Как отправить сообщение всем терминальным пользователям Server 2016 RDS

В Windows Server 2016 в консоли Server Manager в разделе управления настройками ролей Remote Desktop Services при выборе определённой Коллекции нам доступно окно управления клиентскими подключениями к серверам нашей фермы RDS, однако по какой-то странной причине разработчики этой самой консоли посчитали что функцию выбора более одного пользователя для отправки сообщения реализовывать не нужно, …наверно чтобы администраторам жизнь мёдом не казалась..

Как отправить сообщение всем терминальным пользователям Server 2016 RDS

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

[idea]

# $ConnectionBroker — Активный сервер RDCB. Если не указан, будет произведена попытка выявить его автоматически (для этого обязательно чтобы скрипт выполнялся на одном из серверов фермы RDS)

# $SessionHostCollection – Имя RD-коллекции в которой нужно вывести сообщение.

#

$ConnectionBroker = «»

$SessionHostCollection = «KOM-AD01-RDCOLL»

$MessageTitle = «Сообщение от тех.поддержки SAP»

$MessageText = «Уважаемые коллеги!

В связи с проведением работ по расчету зарплаты —

просьба в программе SAP Персонал с 11:00 до конца дня

с табельными номерами не работать!»

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

}

[/idea]

В результате все активные пользователи на всех серверах фермы RDS получат всплывающее сообщение которое трудно не заметить… image

Пример скрипта скачать Сообщение всем пользователям

Запуск PowerShell скрипта из проводника с правами администратора

В Windows скрипты PowerShell (расширение .PS1) по умолчанию не ассоциированы с исполнимым файлом PowerShell.exe. При двойном щелке по файлу сценария PS1 открывается окно тестового редактора notepad.exe. Запустить файл PS1 на выполнение в среде PowerShell можно из контекстного меню проводника, выбрав пункт Run With PowerShell. Однако такой сценарий запускается в рамках сессии пользователя, без прав администратора. Хотя для тех же файлов скриптов .bat, .cmd, имеется отдельный пункт меню Run As administrator. В случае с PowerShell приходится открывать консоль Power Shell с повышенными правами и указывать полный путь к файлу скрипта. Не очень-то удобно.

Рассмотрим, как добавить в контекстное меню проводника File Explorer для файлов с расширением *.ps1, пункт, позволявший запустить скрипт PowerShell с правами администратора.

Запустите редактор реестра (regedit.exe)

Перейдите в ветку HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\shell

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\shell

Создайте подраздел с именем runas и перейдите в него

Внутри раздела runas создайте пустой строковый параметр (String Value) с именем HasLUAShield (этот параметр добавит иконку UAC в контекстное меню проводника)

В разделе runas создайте вложенный подраздел command

HasLUAShield

В качестве значения параметра Default раздела command укажите значение:

[code]powershell.exe «-Command» «if((Get-ExecutionPolicy ) -ne ‘AllSigned’) { Set-ExecutionPolicy -Scope Process Bypass }; & ‘%1′»[/code]

powershell.exe Command

Теперь, если щелкнуть ПКМ по любому *.PS1 файлу, в контекстном меню можно выбрать пункт Run as administrator

PowerShell скрипт ps1 - RunAsAdministrator

Совет. Если скрипт отрабатывает быстро, пользователь успевает только увидеть появившееся и быстро исчезнувшее окно PowerShell. А что делать, если результат выполнения скрипта должен остаться на экране для просмотра пользователем?

Чтобы после окончания работы скрипта, окно консоли PowerShell не закрывалось, необходимо добавить в строку параметр –NoExit:

[code]powershell.exe –NoExit «-Command» «if((Get-ExecutionPolicy ) -ne ‘AllSigned’) { Set-ExecutionPolicy -Scope Process Bypass }; & ‘%1′»[/code]

Готовый reg файл скачать: ps1-ot-administratora

Источники: https://blog.it-kb.ru, http://winitpro.ru

Обновлено 07.06.2019

message logo

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

Постановка задачи

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

Методы отправки сообщения на RDS ферме

  • Отправка сообщение, через диспетчер задач
  • Отправка сообщения через утилиту командной строки msg
  • Отправка сообщения через командлеты PowerShell

Как отправить предупреждение пользователям RDS через диспетчер задач

Во времена терминальных служб на Windows Server 2008 R2, была замечательная возможность массовой отправки сообщений для всех пользователей фермы и делалось, это штатно из диспетчера задач. В 2008R2, когда вы запустите диспетчер задач и перейдете на вкладку «Пользователи», то у вас была возможность выделить их всех, щелкнуть правой кнопкой мыши и из контекстного меню выбрать пункт «Отправить сообщение».

Отправка сообщений в Windows Server 2008 r2

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

Отправка сообщений через диспетчер задач

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

Пример отправленного сообщения на RDS

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

Диспетчер служб удаленных рабочих столов

К сожалению начиная с Windows Server 2012 R2, данную возможность для массовой рассылки из диспетчера задач убрали, вы теперь не можете выделить всех пользователей.

Использование утилиты MSG

Есть такая замечательная утилита командной строки msg. Что хорошо, вы ей можете пользоваться на любом компьютере, хоть на Windows 8.1. Откройте cmd, желательно от имени администратора и просто введите:

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

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

Справка утилиты msg

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

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

Отправка сообщения через msg

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

Пример сообщения отправленного через msg

Для отправки оповещения на удаленный сервер вы должны использовать вот такую конструкцию:

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

Для отправки на несколько серверов, можно использовать вот такое построение команды:

invoke-command -computername computer1, computer2 -scriptblock {msg * «Ваш текст сообщения»}

Использование связки PowerShell и msg

(Get-ADComputer -SearchBase «OU=Workstations,DC=root,DC=pyatilistnik,DC=org» -Filter *).Name | Foreach-Object {Invoke-Command -ComputerName $_ {msg * «Текст сообщения»}

Если у вас выскакивает ошибка «Ошибка 1726 при получении имен сеанса» и сообщение не отправляется, то тут вся загвоздка в том, что у той учетной записи от имени которой открыта командная строка, просто не хватает прав. Вам нужно открыть cmd от имени пользователя у кого есть права на тот сервер.

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

Третий метод отправки сообщения пользователям RDS через Send-RDUserMessage

Безусловно самым популярным и универсальным методом отправки оповещений пользователям удаленного рабочего стола, являются командлеты PowerShell. Одним из таких командлетов выступает Send-RDUserMessage.

Справка по командлеты Send-RDUserMessage — https://docs.microsoft.com/en-us/powershell/module/remotedesktop/send-rdusermessage?view=win10-ps

Запускаем PowerShell от имени администратора или нужного пользователя. Синтаксис будет такой:

Send-RDUserMessage -HostServer «svt2019s01.root.pyatilistnik.org» -UnifiedSessionID 1 -MessageTitle «От отдела технической поддержки» -MessageBody «Сообщение отправлено через Send-RDUserMessage. Пожалуйста сохраните все свои файлы и завершите корректно ваши сессии в программах. Сервер будет перезагружен, через 5 минут С уважением, отдел технической поддержки»

  • HostServer — Имя RDS сервера
  • -UnifiedSessionID — идентификатор сеанса, к сожалению сразу нельзя выбрать всех, обязательно указывать число (Как определить номер сеанса пользователя, читайте по ссылке)
  • -MessageTitle — Текст самого сообщения

Send-RDUserMessage пример отправки

Еще есть скрипт от Microsoft инженера https://gallery.technet.microsoft.com/scriptcenter/Send-NetMessage-Net-Send-0459d235

Еще есть возможность воспользоваться скриптом гуляющем по интернету:

  • 1 скрипт

$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.

Как отправить сообщение всем терминальным пользователям Server 2016 RDS

В Windows Server 2016 в консоли Server Manager в разделе управления настройками ролей Remote Desktop Services при выборе определённой Коллекции нам доступно окно управления клиентскими подключениями к серверам нашей фермы RDS, однако по какой-то странной причине разработчики этой самой консоли посчитали что функцию выбора более одного пользователя для отправки сообщения реализовывать не нужно, …наверно чтобы администраторам жизнь мёдом не казалась..

Как отправить сообщение всем терминальным пользователям Server 2016 RDS

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

[idea]

# $ConnectionBroker – Активный сервер RDCB. Если не указан, будет произведена попытка выявить его автоматически (для этого обязательно чтобы скрипт выполнялся на одном из серверов фермы RDS)

# $SessionHostCollection – Имя RD-коллекции в которой нужно вывести сообщение.

#

$ConnectionBroker = “”

$SessionHostCollection = “KOM-AD01-RDCOLL”

$MessageTitle = “Сообщение от тех.поддержки SAP”

$MessageText = “Уважаемые коллеги!

В связи с проведением работ по расчету зарплаты –

просьба в программе SAP Персонал с 11:00 до конца дня

с табельными номерами не работать!”

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

}

[/idea]

В результате все активные пользователи на всех серверах фермы RDS получат всплывающее сообщение которое трудно не заметить… image

Пример скрипта скачать Сообщение всем пользователям

Запуск PowerShell скрипта из проводника с правами администратора

В Windows скрипты PowerShell (расширение .PS1) по умолчанию не ассоциированы с исполнимым файлом PowerShell.exe. При двойном щелке по файлу сценария PS1 открывается окно тестового редактора notepad.exe. Запустить файл PS1 на выполнение в среде PowerShell можно из контекстного меню проводника, выбрав пункт Run With PowerShell. Однако такой сценарий запускается в рамках сессии пользователя, без прав администратора. Хотя для тех же файлов скриптов .bat, .cmd, имеется отдельный пункт меню Run As administrator. В случае с PowerShell приходится открывать консоль Power Shell с повышенными правами и указывать полный путь к файлу скрипта. Не очень-то удобно.

Рассмотрим, как добавить в контекстное меню проводника File Explorer для файлов с расширением *.ps1, пункт, позволявший запустить скрипт PowerShell с правами администратора.

Запустите редактор реестра (regedit.exe)

Перейдите в ветку HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1shell

HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1shell

Создайте подраздел с именем runas и перейдите в него

Внутри раздела runas создайте пустой строковый параметр (String Value) с именем HasLUAShield (этот параметр добавит иконку UAC в контекстное меню проводника)

В разделе runas создайте вложенный подраздел command

HasLUAShield

В качестве значения параметра Default раздела command укажите значение:

[code]powershell.exe “-Command” “if((Get-ExecutionPolicy ) -ne ‘AllSigned’) { Set-ExecutionPolicy -Scope Process Bypass }; & ‘%1′”[/code]

powershell.exe Command

Теперь, если щелкнуть ПКМ по любому *.PS1 файлу, в контекстном меню можно выбрать пункт Run as administrator

PowerShell скрипт ps1 - RunAsAdministrator

Совет. Если скрипт отрабатывает быстро, пользователь успевает только увидеть появившееся и быстро исчезнувшее окно PowerShell. А что делать, если результат выполнения скрипта должен остаться на экране для просмотра пользователем?

Чтобы после окончания работы скрипта, окно консоли PowerShell не закрывалось, необходимо добавить в строку параметр –NoExit:

[code]powershell.exe –NoExit “-Command” “if((Get-ExecutionPolicy ) -ne ‘AllSigned’) { Set-ExecutionPolicy -Scope Process Bypass }; & ‘%1′”[/code]

Готовый reg файл скачать: ps1-ot-administratora

Источники: https://blog.it-kb.ru, http://winitpro.ru

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

1. С помощью диспетчера задач. Подходит для Windows Server 2003/2008 R2.

Диспетчер задач —> Вкладка Пользователи —> ПКМ —> Отправить сообщение.

 

2. Консольной утилитой msg. Подходит для любой версии Windows Server.

Утилита msg имеет достаточно большой функционал, но лично я обычно пользуюсь всего тремя командами.   

Сообщение всем пользователям текущего сервера:

msg * «Сообщение»

Сообщение конкретному пользователю:

msg ИмяПользователя «Сообщение»

Сообщение пользователю другого сервера в локальной сети:

msg /server:ИмяСервера ИмяПользователя «Сообщение»

По умолчанию сообщение висит 1 минуту. Изменить время ожидания можно ключом /time:времявсекундах. Пример:

msg * /time:3200 «Сообщение»


Windows Server

  • 31.07.2017
  • 14 622
  • 0
  • 08.12.2021
  • 13
  • 13
  • 0

Как отправить сообщение всем пользователям терминального сервера Windows Server

  • Содержание статьи
    • Через диспетчер задач
    • Через командную строку
    • Добавить комментарий

Через диспетчер задач

В старых операционных системах семейства Windows Server, вплоть до Windows Server 2008 R2, есть возможность отправки сообщений всем активным пользователям сервера через Диспетчер задач. Это может быть очень полезно, если нужно оповестить их о каком-нибудь событии, например о выключении сервера или проведении каких-либо технических работ.

Делается это достаточно просто — первым делом нужно открыть Диспетчер задач (самый простой способ — нажать правой кнопкой по панели задач, и выбрать «Диспетчер задач«).

В Диспетчере задач переходим на вкладку «Пользователи».

И там выделяем всех пользователей — либо мышкой, либо выделив самого верхнего пользователя, зажать кнопку Shift, а затем кнопку End.

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

В появившемся окне набираем нужное сообщение. В строке «Заголовок» следует ввести текст, который будет отображаться в заголовке окна, а в поле «Сообщение» собственно само сообщение.

И после этого нажать кнопку «Ок«. После этого у всех пользователей появится отправленное вами сообщение.

Через командную строку

Все это же самое можно проделать и через Командную строку, для этого выполняем в ней команду MSG:

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

Для того, что бы через powershell отправить сообщение пользователю нужно иметь работающий PSRemoting. Если вы не знаете что это, то коротко говоря это возможность удаленного выполнения команд. Эта возможность рассматривалась тут. Коротко говоря если все получатели пользователи домена, а вы являетесь администратором на их компьютере, то единственная настройка, которая вам понадобится это включить WinRM:

Enable-PSRemoting

Если собираетесь использовать IP, или не в домене, то вы будете использовать не Kerberos, а NTLM и нужно сделать следующее:

Enable-PSRemoting
Set-Item wsman:localhostClientTrustedHosts -value *

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

Отправление сообщение пользователю компьютера через WinRM

Для отправки сообщения есть старая утилита msg. Сообщение, которое получит пользователь, будет popup (всплывающее на главном экране). Мы можем проверить его так:

msg * "Ожидается перезагрузка сервера 1С"

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

Invoke-Command -ComputerName AD,AD2 -ScriptBlock {msg * "1C Restart in 10 minutes"}

Где:
ComputerName — имена одного или нескольких компьютеров, на которые будут отправлены сообщения. Можно и IP, но с оговорками выше…
Scriptblock — скрипт, который мы отсылаем на компьютеры. В нашем случае это msg

Сообщение будет выглядеть так:

Powershell отправка сообщения пользователю

Отправка сообщений всем пользователям компьютеров в AD

Сначала получим все имена всех компьютеров в домене и присвоим переменную. Если мой домен называется domain.local, то командлет будет выглядеть так:

$computers = (Get-ADComputer -SearchBase "DC=domain,DC=local" -Filter *).Name

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

$computers = (Get-ADComputer -SearchBase "OU=AllComputers,DC=domain,DC=local" -Filter *).Name

Далее, для каждого компьютера в переменной используем такую команду powershell:

$computers | ForEach {Invoke-Command -ComputerName $_ {msg * "1C Restart in 2 minutes"}}

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

Отправка сообщений через powershell пользователям терминального сервера

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

$session = Get-RDUserSession -ConnectionBroker "rdcb.fixmypc.ru"

Затем мы можем отправить сообщения:

$message = "Ожидается перезагрузка сервера в течении 10 минут"
$session | Send-RDUserMessage -HostServer "rdsh.domain.local" -MessageBody $message

Теги:

#powershell

#ad

imageВ Windows Server 2012 в консоли Server Manager в разделе управления настройками ролей Remote Desktop Services при выборе определённой Коллекции нам доступно окно управления клиентскими подключениями к серверам нашей фермы RDS, однако по какой-то странной причине разработчики этой самой консоли посчитали что функцию выбора более одного пользователя для отправки сообщения реализовывать не нужно, …наверно чтобы администраторам жизнь мёдом не казалась..

image

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

# $ConnectionBroker - Активный сервер RDCB. Если не указан, будет произведена попытка выявить его автоматически (для этого обязательно чтобы скрипт выполнялся на одном из серверов фермы RDS)
# $SessionHostCollection – Имя RD-коллекции в которой нужно вывести сообщение.
# 
$ConnectionBroker = ""
$SessionHostCollection = "KOM-AD01-RDCOLL"

$MessageTitle = "Сообщение от тех.поддержки SAP"
$MessageText = "Уважаемые коллеги! 
В связи с проведением работ по расчету зарплаты - 
просьба в программе SAP Персонал с 11:00 до конца дня 
с табельными номерами не работать!"

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 
}

В результате все активные пользователи на всех серверах фермы RDS получат всплывающее сообщение которое трудно не заметить… image

 / 

Отправка сообщений с помощью msg.exe

14.12.2012

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

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

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

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

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

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

— Имя пользователя

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

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

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

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

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

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

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

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

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

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

Использование утилиты msg.exe на примере отправки сообщения терминальным пользователям в OS Windows Server 2008Отправка сообщений с помощью msg.exe

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

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

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

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

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

msg_2

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

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

msg_3

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

msg_3

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

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

Msg — отправка сообщений пользователю

Команда MSG используется для отправки сообщения пользователям операционной системы Windows. После отправки сообщения из командной строки пользователю будет показано окно с сообщением. Реализация Msg прекрасно подходит для обмена сообщениями между сеансами локальных и терминальных пользователей в пределах одной системы, однако, в случаях обмена между разными компьютерами локальной сети, потребуется изменить некоторые настройки безопасности. Команда Msg одинаково хорошо работает во всех версиях семейства операционных систем Windows. А для подключения к серверу по протоколу RDP используется команда MSTSC.

Синтаксис команды Msg

msg {имя_пользователя|имя_сеанса|код_сеанса| @имя_файла|*} [/server:имя_сервера] [/time:секунды] [/v] [/w] [сообщение]

Параметры команды Msg

  • < имя_пользователя — Задает имя пользователя, получающего сообщение.
  • < имя_сеанса — Задает имя сеанса, получающего сообщение.
  • < код_сеанса — Идентифицирует сеанс, пользователь которого получит сообщение.
  • < @имя_файла — Идентифицирует файл, содержащий список имен пользователей, имен сеансов, коды сеансов, которые получат сообщение.
  • < * — Отправляет сообщение всем пользователям в системе.
  • < /server:имя_сервера — Задает сервер терминалов, сеансы или пользователи которого получат сообщение. Если сервер не указан, параметр /server использует текущий сервер.
  • < /time:секунды — Задает время, в течение которого отправленное сообщение будет отображаться на экране пользователя. При завершении этого времени, сообщение пропадает с экрана. Если ограничение времени не задано, то сообщение будет находиться на экране пользователя до тех пор, пока он не нажмет кнопку OK.
  • < /v — Отображает сведения о выполненных действиях.
  • < /w — Устанавливает режим ожидания ответа от пользователя, получившего сообщение. Этот параметр рекомендуется использовать совместно с параметром /time:секунды, чтобы избежать длительной паузы в случае, если пользователь не может ответить немедленно. Можно также использовать этот параметр совместно с параметром /v.
  • < сообщение — Вводится текст отправляемого сообщения. Если текст сообщения не введен, то система либо попросит сделать это, либо будет использовано стандартное сообщение (STDIN). Чтобы отправить сообщение, содержащее файл, введите символ (>) вслед за именем файла.
  • < /? — Отображает справку в командной строке.msg

Примеры команды Msg

  • Чтобы отправить сообщение с «Встречаемся сегодня в 13-00» для пользователя Администратор, введите: msg Администратор «Встречаемся в 13-00»
  • Чтобы отправить сообщение пользователю Administrator терминального сервера Dell введите msg Administrator /server:Dell  «Привет»
  • Чтобы отправить сообщение отправить текущему локальному пользователю компьютера Windows10, введите: msg /server:Windows10 «Встречаемся сегодня в 17-00»
  • Чтобы отправить сообщение всем сеансам, содержащимся в файле USERLIST, введите: msg @userlist «Встречаемся сегодня в 13-00»
  • Чтобы отправить сообщение всем вошедшим пользователям, введите: msg * «Встречаемся сегодня в 13-00»
  • Чтобы отправить сообщение всем пользователям с отображением сведений о выполненных действиях введите: msg * /v «Встречаемся сегодня в 13-00».

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

1. С помощью диспетчера задач. Подходит для Windows Server 2003/2008 R2.

Диспетчер задач —> Вкладка Пользователи —> ПКМ —> Отправить сообщение.

 

2. Консольной утилитой msg. Подходит для любой версии Windows Server.

Утилита msg имеет достаточно большой функционал, но лично я обычно пользуюсь всего тремя командами.   

Сообщение всем пользователям текущего сервера:

msg * «Сообщение»

Сообщение конкретному пользователю:

msg ИмяПользователя «Сообщение»

Сообщение пользователю другого сервера в локальной сети:

msg /server:ИмяСервера ИмяПользователя «Сообщение»

По умолчанию сообщение висит 1 минуту. Изменить время ожидания можно ключом /time:времявсекундах. Пример:

msg * /time:3200 «Сообщение»

Рассмотрим такие команды как:

  • query
  • qwinsta (query session)
  • quser (query user)
  • mstsc (RDS shadow)
  • msg
  • change logon
  • shutdown

query

query — Отображение информации о процессах; сеансах; пользователя, вошедших на сервер; и серверах, обслуживающих подключение к удаленному рабочему столу

process | session | termserver | user

Более подробно здесь рассмотрятся команды:

query session
query user

а точнее их более короткие аналоги: qwinsta и quser


qwinsta

qwinsta (эквивалент query session) — Отображение информации о сеансах служб удаленных рабочих столов.

С помощью этой команды можно узнать, активен ли сеанс пользователя и ID сеанса

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

qwinsta

Ключ /server позволит указать другой сервер:

qwinsta /server:servername

Показать информацию о сеансе конкретного пользователя:

qwinsta username

Также можно узнать информацию о сеансе пользователя на другом сервере:

qwinsta username /server:servername

Остальные параметры и подробная справка по команде:

qwinsta /?

quser

quser (эквивалент query user) — Отображение информации о пользователях, вошедших в систему

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

В остальном, все ключи у возможности, такие же как и у команды qwinsta:

quser 

Ключ /server позволит указать другой сервер:

 quser /server:servername

Показать информацию о конкретном пользователе:

quser username 

Показать информацию о конкретном пользователе на другом сервере:

quser username /server:servername

Справка и все функции:

quser /?

RDS shadow (mstsc)

RDS Shadow — теневое подключение к сеансу пользователя

Для того, чтобы узнать ID сеанса, нужно воспользоваться одной из вышеупомянутых команд: qwinsta или quser

Теневое подключение без возможности управления сеансом (только просмотр):

 mstsc /shadow:ID 

Теневое подключение для управления другим сеансом:

mstsc /shadow:ID /control

ключ /v:servername позволит подключиться к сеансам другого сервера:

 mstsc /v:servername /shadow:ID /control 

msg

msg — отправить сообщение пользователю

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

msg * your message here

Можно отправить сообщение конкретному пользователю — по его логину, имени сеанса или ID сеанса. Например, так мы скажем пользователю с ID сеанса 12, что ему необходимо выйти из системы:

 msg 12 Срочно завершите сеанс!

ID сеанса можно узнать с помощью уже рассмотренных команд qwinsta или quser


change logon

change logon — включение / отключение входа на терминальный сервер

Полностью отключить вход в терминальные сессии можно командой:

change logon /disable

Включение входа:

change logon /enable

Все возможные ключи смотрим в справке:

change logon /?

shutdown

shutdown — перезагрузка или выключение компьютера. С необходимыми параметрами команда может быть использована для перезагрузки текущего компьютера/сервера, отложенной перезагрузки, удаленной перезагрузки другого компьютера, группы компьютеров, серверов и т.п. Команда имеет множество опций.

Так, например, команда shutdown со следующими параметрами:

shutdown /r /f /t 180 /c "комментарий для перезагрузки"

перезагрузит ваш сервер (/r) спустя 180 секунд (/t 180), принудительно закроет все приложения (/f, используется при указании /t) и укажет причину перезагрузки или комментарий для пользователей (/c «комментарий для перезагрузки»).

Удаленно перезагрузить или выключить компьютер или группу компьютеров через GUI можно командой

shutdown /i

Обновлено 07.06.2019

message logo

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

Постановка задачи

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

Методы отправки сообщения на RDS ферме

  • Отправка сообщение, через диспетчер задач
  • Отправка сообщения через утилиту командной строки msg
  • Отправка сообщения через командлеты PowerShell

Как отправить предупреждение пользователям RDS через диспетчер задач

Во времена терминальных служб на Windows Server 2008 R2, была замечательная возможность массовой отправки сообщений для всех пользователей фермы и делалось, это штатно из диспетчера задач. В 2008R2, когда вы запустите диспетчер задач и перейдете на вкладку «Пользователи», то у вас была возможность выделить их всех, щелкнуть правой кнопкой мыши и из контекстного меню выбрать пункт «Отправить сообщение».

Отправка сообщений в Windows Server 2008 r2

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

Отправка сообщений через диспетчер задач

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

Пример отправленного сообщения на RDS

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

Диспетчер служб удаленных рабочих столов

К сожалению начиная с Windows Server 2012 R2, данную возможность для массовой рассылки из диспетчера задач убрали, вы теперь не можете выделить всех пользователей.

Использование утилиты MSG

Есть такая замечательная утилита командной строки msg. Что хорошо, вы ей можете пользоваться на любом компьютере, хоть на Windows 8.1. Откройте cmd, желательно от имени администратора и просто введите:

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

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

Справка утилиты msg

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

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

Отправка сообщения через msg

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

Пример сообщения отправленного через msg

Для отправки оповещения на удаленный сервер вы должны использовать вот такую конструкцию:

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

Для отправки на несколько серверов, можно использовать вот такое построение команды:

invoke-command -computername computer1, computer2 -scriptblock {msg * «Ваш текст сообщения»}

Использование связки PowerShell и msg

(Get-ADComputer -SearchBase «OU=Workstations,DC=root,DC=pyatilistnik,DC=org» -Filter *).Name | Foreach-Object {Invoke-Command -ComputerName $_ {msg * «Текст сообщения»}

Если у вас выскакивает ошибка «Ошибка 1726 при получении имен сеанса» и сообщение не отправляется, то тут вся загвоздка в том, что у той учетной записи от имени которой открыта командная строка, просто не хватает прав. Вам нужно открыть cmd от имени пользователя у кого есть права на тот сервер.

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

Третий метод отправки сообщения пользователям RDS через Send-RDUserMessage

Безусловно самым популярным и универсальным методом отправки оповещений пользователям удаленного рабочего стола, являются командлеты PowerShell. Одним из таких командлетов выступает Send-RDUserMessage.

Справка по командлеты Send-RDUserMessage — https://docs.microsoft.com/en-us/powershell/module/remotedesktop/send-rdusermessage?view=win10-ps

Запускаем PowerShell от имени администратора или нужного пользователя. Синтаксис будет такой:

Send-RDUserMessage -HostServer «svt2019s01.root.pyatilistnik.org» -UnifiedSessionID 1 -MessageTitle «От отдела технической поддержки» -MessageBody «Сообщение отправлено через Send-RDUserMessage. Пожалуйста сохраните все свои файлы и завершите корректно ваши сессии в программах. Сервер будет перезагружен, через 5 минут С уважением, отдел технической поддержки»

  • HostServer — Имя RDS сервера
  • -UnifiedSessionID — идентификатор сеанса, к сожалению сразу нельзя выбрать всех, обязательно указывать число (Как определить номер сеанса пользователя, читайте по ссылке)
  • -MessageTitle — Текст самого сообщения

Send-RDUserMessage пример отправки

Еще есть скрипт от Microsoft инженера https://gallery.technet.microsoft.com/scriptcenter/Send-NetMessage-Net-Send-0459d235

Еще есть возможность воспользоваться скриптом гуляющем по интернету:

  • 1 скрипт

$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.

  • Как отправить сообщение всем пользователям терминального сервера windows server 2012
  • Как отправить мой компьютер на рабочий стол windows 10
  • Как отправить компьютер в спящий режим с клавиатуры windows 10
  • Как отправить curl запрос в windows
  • Как отобразить ярлыки на рабочем столе windows 10