Установка и настройка роли терминального сервера Remote Desktop Session Host
В этой статье описано, как установить и настроить роль терминального сервера Remote Desktop Session Host на отдельностоящем Windows Server 2022/2019 в рабочей группе (без домена Active Directory) и без всех дополнительных ролей (Connection Broker, Remote Desktop Web Access, RDS Gateway).
Введение
Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В минувший раз мы с вами разобрали, что такое современные центры обработки данных, как они работают и как без них уже невозможно представить жизнь в цифровом мире. Сегодня я хочу в данной статье поделиться огромной и полезной подборкой скриптов PowerShell по обслуживанию RDS фермы. И мне так проще будет их искать и не затерять, да и вам что-то, да пригодится в своей работе, я всегда за то, чтобы помогать друг другу прокачивать знания, не люблю я жадин таких, кто не делится опытом. Так же жду от вас полезные скрипты и что вы ими решаете в комментариях, самые полезные добавлю в саму статью.
Remote Desktop Gateway
Remote Desktop Gateway это один из сервисов роли Remote Desktop Services в Windows Server для организации защищенного доступа из Интернета к службам рабочих столов и опубликованным RemoteApp приложениям через HTTPS шлюз. Сервер с ролью RD Gateway выступает в роли посредника между внешними клиентами и развернутыми внутри службами RDS. При использовании RDGW пользователям не нужно настраивать VPN для подключения к RDS в корпоративной сети. Для подключения используется стандартный клиент Remote Desktop Connection (mstsc.exe).
Развертывание шлюза Remote Desktop Gateway
В этой статье рассмотрим процесс развертывания шлюза Remote Desktop Gateway на Windows Server 2019 (инструкция применима для Windows Server 2022/2016 и 2012 R2).
Шаг 1 – Развертывание окружения RDS – Подготовка серверов:
Добавление серверов:
Добавьте сервера развертывания на панель инструментов Server Manager.

Выберите тип установки.

Выберите тип развертывания.

Выберите сценарий развертывания.

Укажите RD Connection Broker для развертывания.

Укажите сервер RD Web Access для развертывания.

Укажите серверы RD Session Hosts для развертывания.

Разверните выбранные опции.

Завершение
После завершения указанных шагов, у вас должен быть успешно развернут и настроен Remote Desktop Gateway на вашем сервере Windows.
Развертывание среды RDS – обзор развертывания:

Развертывание среды RDS – установка и настройка лицензионного сервера RDS:









Развертывание среды RDS – создание коллекции в развертывании RDS:



Развертывание готово к принятию соединений.
Дополнительная информация – развертывание среды RDS. Завершите развертывание, используя PowerShell:
Эта первая строка создает развертывание, указывая Broker Connection, сервер доступа к Web и только один хост RD-сеанса:
Следующая строка добавляет второй хост RD-сеанса к развертыванию:
Третья строка устанавливает роль лицензирования RDS на контроллере домена:
Четвертая строка настраивает лицензионный сервер и режим лицензирования для развертывания. Эта строка потребует подтверждения:

После добавления всех серверов в панель управления Server Manager и нажатия кнопки обновления, результат будет таким же, как при использовании GUI: новое установленное стандартное развертывание RDS.
Смотрите это видео:
## Как узнать статус службы удаленно на пуле серверов
После перезапуска службы Zabbix будет правильно узнать ее состояние. Для этого у вас должен быть список серверов в файле и мой скриптик.
```markdown
\# Получаем список серверов из файла и сохраняем его в переменную $serverList = Get-Content C:TempRDSservers.txt
\# Добавляем объект в массив данных $statusData += $statusObj }
## Публикация приложения RemoteApp на RDS в рабочей группе (без домена)
На RDS в рабочей группе недоступна консоль управления сеансами, и поэтому отсутствуют инструменты для публикации приложений RemoteApp. Но есть обходное решение позволяющее через реестр опубликовать любое приложение в RemoteApp без домена Active Directory.
Пример REG файла для публикации на RDS сервере AdobeReader в качестве RemoteApp:
Замените имена и пути в REG файле на ваши и импортируйте его в реестр RDSH.
Теперь вручную отредактируйте файл \*.RDP ярлыка, чтобы при его запуске автоматически запускалось опубликованное приложение. Добавьте в RDP файл следующие строки:
Попробуйте запустить RemoteApp приложение на RDS с поммощью вашего RDP файла. Опубликованное на RDSH приложение должно успешно запуститься на вашем рабочем столе.
Решение проблемы с медленной работой RemoteApp в Windows Server 2019/2016 описано здесь.## Настройка RDP клиента для подключения шлюзу RD Gateway
Теперь можно настроить клиент Remote Desktop Connection для подключения к вашим внутренним RDS хостам через шлюз удаленных рабочих столов.
Если вы используете утилиту RDCMan для RDP подключений, параметры RD Gateway можно задать на вкладке GatewaySetting. Включите опцию Use a TS Gateway server и укажите параметры подключения.
При успешном подключении пользователя через RDGW в журнале появится событие с Event ID 205 от источника TerminalServices-Gateway
Если вы хотите запускать RemoteApp через RD Gateway, нужно добавить в \*.rdp файл remoteapp следующие строки:
В этой статье мы показали, как настроить роль Remote Desktop Gateway на Windows Server для реализации защищенного удаленного доступа в вашу сеть с помощью RDP over HTTPS.## Массовая удаленная настройка файла конфигурации Zabbix
✅У меня в компании в качестве основного средства мониторинга используется Zabbix сервер, я все давно хочу написать о нем кучу полезных вещей по типу:но все до этого не доходят руки, хотя материала огромное количество. Так как моя RDS ферма состоит из 50 хостов, и на каждом ручками нужно было настроить файл zabbix_agentd.conf, то я понял насколько это нудно повторять одни и те же действия, а именно поменять в файле поля:
Чтобы это делать удаленно и по возможности на любое количество хостов, я написал два PowerShell скрипта.
Первый скрипт заполняет ListenIP и SourceIP беря текущий IP адрес сервера, Hostname= он берет из текстового файла по которому пробегает скрипт и сравнивает его с тем, что в системе, после чего проставляет его.
Write-Host Configuration file updated with current IP address and hostname.
Второй скрипт берет нужный список серверов из файла, после чего создает удаленную сессию и производит выполнение первого скрипта, который уже и подгоняет конфиг Zabbix под нужные требования.
serverList = Get-Content C: empservers.txt
Тут главное поменять путь до правильного скрипта.
## Настройка политик доступа RDS Gateway
Для управления политиками и правилами доступа на RDGW используется консоль RD Gateway Manager (tsgateway.msc). Здесь нужно настроить два типа политик:
1. Создайте сначала политику RD CAP.
2. Также вы можете создать политику клиентского доступа RDGW с помощью PowerShell.
3. Затем создайте политику RD RAP.
## Настройка SSL сертификата для Remote Desktop Gateway
Для защиты подключения к шлюзу RDS на нем нужно установить сертификат. Оптимально использовать коммерческий сертификат, выданный внешним центром сертификации. Возможно использовать бесплатного SSL сертификат Let’s Encrypt (установка Let’s Encrypt сертификата на IIS для Remote Desktop Gateway). Также вы можете использовать самоподписанный SSL сертификат Windows, но здесь имейте в виду что внешние клиенты должны обязательно доверять такому сертификату. Если клиент не доверяет сертификату на сервере RDGW, он не сможет подключиться к шлюзу (самоподписанные SSL сертификаты можно импортировать на клиентов вручную или через GPO).
В поле Subject Name (CN) или Subject Alternative Name сертификата должно обязательно содержаться DNS имя сервера RDGW, которое будет использоваться для подключения внешними клиентами (доступное из интернета).
В Windows Server 2019 для подключения к RDGateway используются следующие порты. Не забудьте открыть (пробросить) эти порты на ваш RDGW хост на сетевом оборудовании.
| Порт | Протокол |
|------------|----------|
| 443 TCP | HTTPS |
| 3391 UDP | RDP |
## Настройка шлюза RD Gateway в рабочей группе
Откройте консоль RDGW Manager и убедитесь, что в ней нет ошибок и все пункты зелёные.При размещении отдельностоящего RDSH сервера в интернете, открывать наружу стандартный RDP порт 3389 небезопасно. В журналах безопасности хоста будут постоянно фиксироваться события перебора паролей по RDP. Вы можете безопасно опубликовать RDSH в интернете через RD Gateway и использовать для RDP доступа защищённое SSL/TLS подключение по порту TCP:443.
Вопреки распространённому убеждения, RD Gateway можно развернуть без домена Active Directory (в рабочей группе).
Предполагаем, что вы развернули отдельный RDS хост с Windows Server в рабочей группе.
Установите роль RDGateway с помощью команды:
Install-WindowsFeature RDS-Gateway -IncludeAllSubFeature –IncludeManagementTools
Откройте консоль RD Gateway Manager ( tsgateway.msc ) и создайте политику Connection Authorization Policy (CAP).
После этого создайте новую Resource Authorization Policy (RAP).
Следующий этап – установить SSL/TLS сертификат для защиты подключений к шлюзу RDS. Можно использовать бесплатный SSL сертификат Let’s Encrypt или самоподписанный SSL сертификат Windows (для простоты мы будем использовать этот вариант).
По умолчанию для RDGW генерируется самоподписанный сертификат со сроком действия полгода. С помощью PowerShell можно создать сертификат с большим сроком. В CN имени сертификата или в Subject Alternative Name (DNS) должно содержаться внешнее DNS имя и/или статический (белый) IP адрес сервера RD Gateway, к которому будут подключаться клиенты. Укажите через запятую все необходимые имена при создании сертификата:
$todaydate = Get-Date$addyear = $todaydate.AddYears(5)New-SelfSignedCertificate -dnsname rdgw.winitpro.ru,123.123.123.12,gw.mydomain.ru -notafter $addyear -CertStoreLocation cert:LocalMachineMy

Теперь можно настроить подключение на клиенте. В первую очередь надо экспортировать с сервера RDGW сертификат.
Этот сертификат нужно установить на клиенте. Если клиент не доверяет сертификату RD Gateway, он не сможет подключиться к шлюзу.
Вы можете установить сертификат вручную или через GPO. Установить сертификат в Trusted Root Certification Authorities.


Если SAN имя в сертификат не соответствует имени RD gateway хоста в подключении, появится ошибка:
Your computer cannot connect to the remote computer because the remote desktop gateway server address requested, and the certificate subject name do not match.

Скрипт по поиску событий RDS для определенного логина
✅В задачу данного скрипта входит проанализировать три журнала RDS на ваших брокерах подключений, которые скрипт получает из скрипта:

Установка Remote Desktop Licensing и RDS лицензий (CAL)
Теперь нужно настроить роль Remote Desktop Licensing, которая обеспечивает лицензирование подключений пользователей к вашему RDS хосту. Допустимо установить и активировать роль Remote Desktop Licensing на этом же сервере (если он у вас один), либо можете разместить роль RDLicensing на отдельном сервере. Один сервер RDS Licensing можете выдавать лицензии неограниченному количеству RDSH хостов.
Если вы решили использовать локальный сервер RDLicensing, активируйте сервер лицензий RDS и установите клиентские лицензии (RDS CAL) согласно гайду по ссылке.
Remote Desktop License Issue There is a problem with your Remote Desktop license, and your session will be disconnected in 60 minutes.

Массовая проверка отпечатка сертификата используемого при RDP сессии на удаленных серверах
✅Начиная с Windows 11 и Windows Server 2022 компания Microsoft усиливает безопасность по всем направлениям, и теперь если вам на удаленной стороне, куда вы производите RDP подключение, должен подставляться не самоподписанный сертификат, а доверенный. Если этого не сделать, то есть вероятность получать, что произошла внутренняя ошибка.
В идеале у вас должен быть поднят Active Directory CA, но если его нет, то вы легко можете установить любой Wildcard сертификат с вашим доменом (Даже внутренний если не хотите настраивать политику CA) от доверенного CA. Данный скрипт запрашивает удаленные серверы из файла и выводит какой sslCertificateHash, используется, чтобы понять тот сертификат или нет, что вы до этого ставили.
$serverList = Get-Content "C:TempSSLServers.txt"
Массово получить информацию о CPU, RAM, SSD
Иногда нужно быстро проверить все ли характеристики у терминальных серверов одинаковые, сравнив CPU, RAM, SSD. Я написал простой скрипт, который это делает за пару минут.
# Получаем список серверов из файла $servers = Get-Content -Path "C:TempRDSservers.txt"
# Получаем информацию о системе $system = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $server
# Получаем информацию о процессоре $processor = Get-WmiObject -Class Win32_Processor -ComputerName $server
# Получаем информацию о дисках $disks = Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" -ComputerName $server
# Добавляем объект в массив результатов $result += $object }

Как получить текущие настройки Zabbix на пуле серверов
Еще из полезных скриптов могу отметить, что вы можете первым скриптом запросить текущие настройки ListenIP=, Hostname=, SourceIP=. А вторым скриптом выполнить первый удаленно и получить массовый результат.
#$filePath = "C:Program FilesZabbix Agent 2zabbix_agent2.conf" #Тут зависит от версии вашего агента $filePath = "C:Program FilesZabbix Agentzabbix_agentd.conf"
$sourceIP = "" $listenIP = "" $hostname = ""

Тут правильно укажите путь и и имя до вашего скрипта, а так же информация сохранится в текстовый файл для анализа.
Установка роли Remote Desktop Services Host в Windows Server
Предполагаем, что вы уже установили сервер с Windows Server (2022, 2019 или 2016) и задали первоначальные настройки (задали сетевые параметры и статический IP адрес, имя сервера (hostname), время/дату/часовой пояс, установили последние обновления и т.д.). Теперь можно установить службу RDS через консоль Server Manager или из PowerShell:

Если вы выбрали в Server Manager тип установки Remote Desktop Services installation, то в режиме Standard deployment и Quick Start установщик дополнительно установит роли RD Connection Broker и RD Web Access. В нашем случае все эти роли излишни, т.к. мы ставим стендалон RDS сервер.

Также вы можете установить указанные роли Windows Server с помощью PowerShell:
Install-WindowsFeature -Name RDS-Licensing, RDS-RD-Server –IncludeManagementTools

Проверьте, какие RDS роли установлены на сервере:

Перезагрузите Windows командой:
Массовая установка сертификата, который будет подставляться RDP службой к подключаемому серверу
Чуть выше мы проверяли сертификат, а вот если он не тот, что нужен на удаленном сервере, то нам необходимо его установить. Для этого нам нужно получить список удаленных серверов из файла, скопировать на них сертификат и установить его в локальное расположение компьютера и не забыть дать права на его чтение для учетной записи NETWORK SERVICE.
Из нюансов, ваш сертификат должен быть в формате PFX и располагаться совместно с вашим скриптом в одной директории.
#Создаем логи если их нет
$log_folder = "$PSScriptRootLogs" + $($MyInvocation.MyCommand.Name -replace (".ps1", "")) $log = "$log_folder$(Get-Date -Format "yyyy_MM_dd_HH_mm_ss").txt"
### Тут мы подгружаем файл со списком серверов
$Thumbprint = "3a9ba2991ca444779cdbac4211113c4adcaf1111"
Copy-Item -Path "$PSScriptRootpyatilistnik_new.pfx" -Destination "\$serverC$WindowsTemppyatilistnik_new.pfx" -Force -Verbose
### Установка удаленной сессии
$session = New-PSSession -ComputerName $server
Данный скрипт решал проблему "Ошибка 0x907 при подключении к RDP" и ошибку 0x8009030D.
Как получить статус DFSS на всех серверах RDSH

P.S.
По мере написания еще каких-то скриптов, я буду обновлять текущую статью. Если у вас есть, что-то полезное, то пишите об этом в комментариях.
Если вам нужно организовать безопасный доступ к вашему RDS северу через интернет, рекомендуется разместить его за VPN или опубликовать через шлюз RD Gateway.
Remote Desktop Gateway позволит открыть безопасный доступ из Интернета к RDS серверу интернета по защищенному SSL/TLS подключение по порту TCP:443 (вместо того, чтобы открывать стандартный RDP порт 3389, на котором будут постоянно фиксироваться попытки перебора паролей по RDP).
Вопреки распространённому заблуждению, RD Gateway можно развернуть без домена Active Directory. Подробная инструкция по настройке шлюза RD Gateway без домена доступна в статье Настройка шлюза Remote Desktop Gateway на Windows Server.
Скрипт по переводу RDSH в режим стока
✅Первый скрипт который я опишу делает перевод серверов на которых работают пользователи в режим Drain Mode, чтобы в дальнейшем их обслужить без влияния на работу людей.
# Импортируем список серверов из файла $servers = Get-Content "c:Temp ermfarm.txt"
# Переводим или выводим из Drain Mode foreach ($server in $servers)
Set-RDSessionHost -SessionHost $server -NewConnectionAllowed yes -ConnectionBroker "rdcb01.root.pyatilistnik.org"
Скрипт был взят из статьи про режим стока, там все подробности.
Установка роли RDS-Gateway в Windows Server
Служба шлюза удаленных рабочих столов не является обязательным компонентом фермы RDS, поэтому ее нужно установить отдельно. В большинстве случае рекомендуется использовать отдельный сервер для развертывания RDGW или можно совместить его с RDWeb.
Предполагается, что в вашей сети уже развернута служба каталогов Active Directory и ферма серверов RDS.

При установке службы RDGW также устанавливаются веб сервер IIS и роль NPS (Network Policy Server).
Убедитесь, что роль RDS-Gateway установлена:

Или установите роль в Windows Server с помощью команды Install-WindowsFeature:
Создайте группы доступа в Active Directory с помощью консоли ADUC или с помощью PowerShell:
Настройка роли Remote Desktop Session Host в рабочей группе
Откройте консоль управления Remote Desktop Licensing Diagnoser ( lsdiag.msc ). В данном случае сервер RDSH еще не настроен на получение RDS CAL лицензий с сервера лицензирования. Об этом свидетельствуют надписи:

Если вы не нацелите ваш RDSH сервер на сервер лицензирования, ваш сервер будет находится в триальном grace режиме. Пользователи могут использовать его в течении 120 дней (при каждом подключении в трее будет появляться сообщение “ Служба удаленных рабочих столов перестанет работать через xxx дней ”). После окончания grace периода ваши пользователи не смогут подключится к RDS с ошибкой:
Remote session was disconnected because there are no Remote Desktop client access licenses available for this computer.
Чтобы задать адрес сервера лицензирования RDS и тип лицензии, воспользуйтесь консолью редактора локальной групповой политики Windows ( gpedit.msc ).
Дополнительно в локальных GPO вы можете настроить лимиты (таймауты) на длительность RDP сессий и правила отключения пользователей при неактивности.
Если вам нужно создать отдельные групповые политики с настройками для локальных пользователей и администраторов, воспользуйтесь функционалом множественных GPO (MLGPO).
Теперь создайте для локальные учетные записи пользователей, который они будут использовать для входа на RDS. Можно создать пользователей с помощью оснастки lusrmgr.msc или через PowerShell:
Теперь пользователи могут попробовать со своих компьютеров подключится к вашему RDS хосту с помощью клиента mstsc.exe (или любого другого RDS клиента). Проверьте, что к серверу одновременно может подключится более двух активных RDP сессий.
При первом входе устройству пользователя выдается временная лицензия (особенности RDS Per Device лицензирования). При втором входе выдается постоянная лицензия, которая появится в консоли Remote Desktop Licensing Manager. Лицензия выдается на срок от 52 до 89 дней (случайное число).
Event ID: 82 The "Temporary" Windows Server 2022 : RDS Per Device CAL belonging to computer "ComputerName" has been upgraded to "Permanent" Windows Server 2022 : RDS Per Device CAL.

Если вам нужно подключиться в RDP сессию пользователя, вы можете воспользоваться режимом теневого подключения RDS (он работает и на RDSH в рабочей группе).
Как использовать данные скрипты
‼️Все Скрипты написал Иван Сёмин, сайт https://pyatilistnik.org/ использовать можно бесплатно, размещать на других ресурсах только при добавлении активной ссылки на источник‼️
Удаленно перезапустить службу Zabbix на куче серверов
✅Это нужно после выполнения описанных выше скриптов, да и вообще в целом полезно это уметь, так как служба иногда может зависнуть или остановится. Тут два скрипта, в первом простая команда по перезапуску службы Zabbix 2, он называется Restart-Service Zabbix.ps1.
Restart-Service -Name "Zabbix Agent 2"
Второй скрипт запускает первый на списке удаленных хостов.
$serverList = Get-Content "C: empservers.txt"
Массовое копирование папки или ярлыка на список серверов
Когда вы кастомизируете ваша RDSH хосты или появилась необходимость на все узлы добавить новую папку с приложением (Например что-то самописное) и вывести ярлык на общий рабочий стол, то можете за основу взять такой скрипт.
$serverList = Get-Content -Path "C:Tempservers.txt" #Список серверов куда копируем $sourceFolder = "C:TempSoftWordMerge" #Папку, которую будем копировать $destinationFolder = "c$Program Files (x86)pyatilistnik Apps" #Куда будем копировать $fileToCopy = "C:TempSoftMcdSoft.Crm.WordMergeUtil.lnk" #Копируемый файл ярлык


