Разрешение нескольких RDP-подключений на Windows
Зачем эта инструкция?
Удаленные пользователи могут подключаться к своим компьютерам Windows 10 или 11 через службу удаленных рабочих столов (RDP). Достаточно разрешить RDP доступ и подключиться к компьютеру с помощью любого клиента. Но есть ограничение на количество одновременных RDP сессии – допускается одновременная работа только одного удаленного пользователя. Если вы попробуете открыть вторую RDP сессию, появится предупреждение с запросом отключить сеанс первого пользователя.
Ограничение на количество одновременных RDP подключений в Windows является не техническим, но программным и лицензионным. Таким образом Microsoft запрещает создавать терминальный RDP сервер на базе рабочей станции для одновременной работы нескольких пользователей. Логика Microsoft проста: если вам нужен терминальный сервер — купите лицензию Windows Server, лицензии RDS CAL, установите и настройте роль Remote Desktop Session Host (RDSH).
Технически, любая редакция Windows при наличии достаточного количества оперативной памяти может обслуживать одновременную работу нескольких десятков удаленных пользователей. В среднем на одну RDP сессию пользователя без учета запускаемых приложений требуется 150-200 Мб памяти. Т.е. максимальное количество одновременных RDP сессий в теории ограничивается только ресурсами компьютера.
Решение проблемы
Мы будем использовать PowerShell скрипт для автоматического патчинга файла. Данный скрипт написан для версии Windows PowerShell, и не работает на PowerShell Core. Скрипт универсальный и может использоваться для внесения изменений в файл termsrv.dll на всех версиях Windows 10 и Windows 11.
# PowerShell скрипт модифицирует файл termsrv.dll, разрешая множественные RDP
# подключения к рабочим станциям на базе Windows 10 (1809 и выше) и Windows 11
# Подробности https://winitpro.ru/index.php/2015/09/02/neskolko-rdp-sessij-vwindows-10/
# Остановить службу, сделать копию файл и изменить разрешения
Stop-Service UmRdpService -Force
Stop-Service TermService -Force
$termsrv_dll_acl = Get-Acl c:\windows\system32\termsrv.dll
Copy-Item c:\windows\system32\termsrv.dll c:\windows\system32\termsrv.dll.copy
takeown /f c:\windows\system32\termsrv.dll
$new_termsrv_dll_owner = (Get-Acl c:\windows\system32\termsrv.dll).owner
cmd /c "icacls c:\windows\system32\termsrv.dll /Grant $($new_termsrv_dll_owner):F
/C"
# поиск шаблона в файле termsrv.dll
$dll_as_bytes = Get-Content c:\windows\system32\termsrv.dll -Raw -Encoding byte
$dll_as_text = $dll_as_bytes.forEach('ToString', 'X2') -join ' '
$patternregex = ([regex]'39 81 3C 06 00 00(\s\S\S){6}')
$patch = 'B8 00 01 00 00 89 81 38 06 00 00 90'
$checkPattern=Select-String -Pattern $patternregex -InputObject $dll_as_text
If ($checkPattern -ne $null) {
$dll_as_text_replaced = $dll_as_text -replace $patternregex, $patch
}
Elseif (Select-String -Pattern $patch -InputObject $dll_as_text) {
Write-Output 'The termsrv.dll file is already patch, exitting'
Exit
}
else {
Write-Output "Pattern not found "
}
# модификация файла termsrv.dll
[byte[]] $dll_as_bytes_replaced = -split $dll_as_text_replaced -replace '^', '0x'
Set-Content c:\windows\system32\termsrv.dll.patched -Encoding Byte -Value
$dll_as_bytes_replaced
# Сравним два файла
fc.exe /b c:\windows\system32\termsrv.dll.patched c:\windows\system32\termsrv.dll
# замена оригинального файла
Copy-Item c:\windows\system32\termsrv.dll.patched c:\windows\system32\termsrv.dll
-Force
Set-Acl c:\windows\system32\termsrv.dll $termsrv_dll_acl
Start-Service UmRdpService
Start-Service TermService
Чтобы выполнить скрипт, скачайте его на свой компьютер. Далее измените настройки политики запуска скриптов PowerShell:
Set-ExecutionPolicy Bypass -Scope Process -Force
Затем запускаем сам скрипт в PowerShell от имени администратора:
C:\users\root\desktop\rdp_patch.ps1
Скрипт нужно запускать после установки обновлений Windows, чтобы немедленно внести изменения в файл termsrv.dll (защищает вас от ручной правки файла после каждой установки обновлений). Скрипт подходит для всех версий Windows 10 старше 1809 и для Windows 11.
Преимущество этого способа включения нескольких RDP сессий в Windows в том, что он работает путем замены файла части файла оригинальной системной библиотеки termsrv.dll. Как следствие, на этот подход не реагируют антивирусы.
ВНИМАНИЕ!!! У ЭТОГО ПОДХОДА ЕСТЬ ОСОБЕННОСТЬ!
При каждом обновлении Windows 10 (или при обновлении версии файла termsrv.dll в рамках других обновлений) придется снова запускать скрипт, т.к. оригинальная библиотека вернется в свое прежнее состояние (до патча)!
Ссылки
- Оригинальная статья: https://web-profi.by/neskolko-odnovremennyx-rdp-sessij-polzovatelej-vwindows-10/
- Репозиторий проекта: https://github.com/winadm/posh/blob/master/Desktop/RDP_patch.ps1
No comments to display
No comments to display