# Разрешение нескольких 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. Скрипт универсальный и может использоваться для внесения изменений в файл <span style="color: rgb(22, 145, 121);">**termsrv.dll**</span> на всех версиях Windows 10 и Windows 11.

```powershell
# 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:

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force
```

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

```powershell
C:\users\root\desktop\rdp_patch.ps1
```

Скрипт нужно запускать после установки обновлений Windows, чтобы немедленно внести изменения в файл <span style="color: rgb(22, 145, 121);">**termsrv.dll**</span> (защищает вас от ручной правки файла после каждой установки обновлений). Скрипт подходит для всех версий Windows 10 старше 1809 и для Windows 11.

Преимущество этого способа включения нескольких RDP сессий в Windows в том, что он работает путем замены файла части файла оригинальной системной библиотеки <span style="color: rgb(22, 145, 121);">**termsrv.dll**</span>. Как следствие, на этот подход не реагируют антивирусы.

  
<span style="background-color: rgb(186, 55, 42); color: rgb(255, 255, 255);"> **ВНИМАНИЕ!!! У ЭТОГО ПОДХОДА ЕСТЬ ОСОБЕННОСТЬ!** </span>  
При каждом обновлении Windows 10 (или при обновлении версии файла <span style="color: rgb(22, 145, 121);">**termsrv.dll**</span> в рамках других обновлений) придется снова запускать скрипт, т.к. оригинальная библиотека вернется в свое прежнее состояние (до патча)!

#### Ссылки

- Оригинальная статья: [https://web-profi.by/neskolko-odnovremennyx-rdp-sessij-polzovatelej-vwindows-10/](https://web-profi.by/neskolko-odnovremennyx-rdp-sessij-polzovatelej-vwindows-10/)
- Репозиторий проекта: [https://github.com/winadm/posh/blob/master/Desktop/RDP\_patch.ps1](https://github.com/winadm/posh/blob/master/Desktop/RDP_patch.ps1)