Computer >> 컴퓨터 >  >> 시스템 >> Windows 11

Windows 10·11에서 동시에 여러 RDP 세션을 허용하는 방법 완벽 가이드

원격 사용자는 원격 데스크톱 서비스(RDP)를 통해 Windows 10 및 Windows 11 컴퓨터에 접속할 수 있습니다. 장치 설정에서 RDP를 활성화하고 원격 데스크톱 클라이언트만 있으면 컴퓨터에 연결할 수 있습니다. 하지만 동시 RDP 세션 수에는 제한이 있어, 한 번에 한 명의 원격 사용자만 작업할 수 있습니다. 두 번째 RDP 세션을 열려고 하면 첫 번째 사용자의 세션 연결을 해제하라는 경고가 표시됩니다.

다른 사용자가 로그인되어 있습니다. 계속하면 해당 사용자의 연결이 해제됩니다. 그래도 로그인하시겠습니까?

Windows 데스크톱 버전의 RDP 제한 사항

모든 Windows 데스크톱 버전(Windows 10 및 11 포함)은 원격 데스크톱 서비스 사용에 다음과 같은 제한을 두고 있습니다.

  1. RDP를 통한 원격 연결은 상위 에디션(Professional, Enterprise)에서만 가능합니다. Windows Home 및 Single Language 에디션에서는 들어오는 원격 데스크톱 연결이 금지되어 있습니다.
  2. 동시 RDP 연결은 하나만 지원됩니다. 두 번째 RDP 세션을 열려고 하면 활성 연결을 종료하라는 메시지가 표시됩니다.
  3. 컴퓨터 콘솔(로컬)에서 작업 중인 사용자가 있는 경우, 새 원격 RDP 연결을 생성하려고 하면 콘솔 세션이 강제로 해제됩니다. 반대로 원격 RDP 세션이 활성화된 상태에서 로컬 로그인을 시도하면 원격 세션도 강제로 끊깁니다.

사실 이러한 동시 RDP 연결 수 제한은 기술적인 문제가 아니라 라이선스 정책에 따른 것입니다. 즉, 이 제한 때문에 여러 사용자가 사용할 수 있는 터미널 RDP 서버를 워크스테이션 기반으로 구축할 수 없습니다. Microsoft의 논리는 단순합니다. 터미널 서버가 필요하다면 Windows Server 라이선스와 RDS CAL을 구매하고, 원격 데스크톱 세션 호스트(RDSH) 역할을 설치·구성하라는 것입니다.

기술적으로 충분한 RAM을 갖춘 모든 Windows 버전은 수십 명의 원격 사용자 동시 작업을 지원할 수 있습니다. 사용자 세션 하나당 평균 150~200MB의 RAM이 필요합니다(실행 중인 애플리케이션 제외). 따라서 최대 동시 RDP 세션 수는 이론상 컴퓨터 리소스에 의해서만 제한됩니다.

이 글에서는 Windows 10과 11에서 동시 RDP 연결을 허용하는 두 가지 방법을 살펴봅니다. RDP Wrapper 도구를 사용하는 방법과 termsrv.dll 시스템 파일을 패치하는 방법입니다.

참고: 본문에서 설명하는 시스템 수정은 Microsoft 라이선스 계약 위반으로 간주될 수 있으므로, 반드시 본인의 책임하에 진행해야 합니다.

RDP Wrapper: Windows에서 다중 RDP 세션 활성화

RDP Wrapper Library 오픈소스 프로젝트를 사용하면 termsrv.dll 파일을 교체하지 않고도 Windows 10에서 여러 RDP 세션을 활성화할 수 있습니다. 이 도구는 SCM(서비스 제어 관리자)과 원격 데스크톱 서비스 사이에서 레이어로 작동합니다. RDPWrap은 다중 동시 RDP 연결 지원뿐만 아니라 Windows Home 에디션에서도 RDP 서버를 구축할 수 있게 해줍니다. RDP Wrapper는 termsrv.dll 파일을 직접 변경하지 않고, 변경된 매개변수로 termsrv 라이브러리를 로드하는 방식입니다.

따라서 termsrv.dll 파일이 업데이트되더라도 RDPWrap은 계속 작동합니다. Windows 업데이트를 걱정하지 않아도 되는 이유입니다.

중요: RDP Wrapper를 설치하기 전에 원본(패치되지 않은) termsrv.dll 파일을 사용 중인지 반드시 확인하세요. 그렇지 않으면 RDP Wrapper가 불안정해지거나 아예 시작되지 않을 수 있습니다.

RDP Wrapper는 GitHub 저장소 https://github.com/binarymaster/rdpwrap/releases 에서 다운로드할 수 있습니다(최신 버전은 v1.6.2). 프로젝트 자체는 2017년 이후 업데이트되지 않았지만, 최신 Windows 10 빌드는 물론 Windows 11에서도 사용할 수 있습니다.

RDPWrap-v1.6.2.zip 압축 파일에는 다음 파일들이 포함되어 있습니다.

  • RDPWinst.exe — RDP Wrapper Library 설치/제거 프로그램
  • RDPConf.exe — RDP Wrapper 구성 도구
  • RDPCheck.exe — RDP 확인 유틸리티(로컬 RDP 검사기)
  • install.bat, uninstall.bat, update.bat — RDP Wrapper 설치, 제거, 업데이트용 배치 파일

RDPWrap을 설치하려면 install.bat 파일을 관리자 권한으로 실행합니다. 프로그램은 C:\Program Files\RDP Wrapper 디렉터리에 설치됩니다.

설치가 완료되면 RDPConfig.exe를 실행합니다. 설치 직후에는 도구가 RDP wrapper가 실행 중(Installed, Running, Listening)이지만 작동하지 않는다고 표시할 가능성이 높습니다. 빨간색 [not supported] 경고에 주목하세요. 이는 현재 Windows 10 버전(ver. 10.0.19041.1320)이 RDPWrapper에서 지원되지 않는다는 의미입니다.

그 이유는 Windows 10의 각 버전마다 rdpwrap.ini 구성 파일에 해당하는 설명 항목이 필요하기 때문입니다. 현재 구성 파일에는 사용 중인 Windows 10 빌드에 대한 설정이 없는 것입니다.

최신 rdpwrap.ini 파일은 https://raw.githubusercontent.com/sebaxakerhtc/rdpwrap.ini/master/rdpwrap.ini 에서 다운로드할 수 있습니다.

해당 페이지의 내용을 "C:\Program Files\RDP Wrapper\rdpwrap.ini" 파일에 직접 복사하거나, PowerShell cmdlet Invoke-WebRequest를 사용해 다운로드할 수 있습니다(먼저 원격 데스크톱 서비스를 중지해야 합니다).

Stop-Service termservice -Force
Invoke-WebRequest https://raw.githubusercontent.com/sebaxakerhtc/rdpwrap.ini/master/rdpwrap.ini -outfile "C:\Program Files\RDP Wrapper\rdpwrap.ini"

컴퓨터를 재시작한 후 RDPConfig.exe를 실행합니다. Diagnostics 섹션의 모든 항목이 초록색으로 표시되고 [Fully supported] 문구가 나타나는지 확인하세요. 아래 스크린샷은 새 구성을 적용한 RDP Wrapper가 Windows 11에서도 정상 작동함을 보여줍니다.

이제 여러 개의 RDP 세션으로 컴퓨터에 접속해 보세요(mstsc.exe, rdcman 등 어떤 RDP 클라이언트든 사용 가능). 정상적으로 작동하며, 저장된 RDP 자격 증명도 사용할 수 있습니다. 이제 Windows 10에서 두 명 이상의 원격 사용자가 서로 다른 RDP 세션을 동시에 사용할 수 있습니다.

RDPWrap 도구는 모든 Windows 에디션에서 지원되므로, 어떤 Windows 장치에서든 자체 터미널(RDS) 서버를 구축할 수 있습니다.

또한 RDP Wrapper는 다음과 같은 기능도 제공합니다.

  • 원격 데스크톱 활성화
  • Hide users on logon screen 옵션으로 Windows 로그온 화면에서 사용자 목록 숨기기
  • Single session per user 옵션을 비활성화하면 동일한 사용자 계정으로 여러 개의 동시 RDP 세션 허용(레지스트리 키 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\fSingleSessionPerUser의 값이 fSingleSessionPerUser = 0으로 설정됨)
  • RDP Port — 원격 데스크톱 포트 번호를 TCP 3389에서 다른 포트로 변경
  • Session Shadowing Mode 섹션에서 RDP 세션에 대한 원격 제어(섀도잉) 연결 모드 구성

GPO(그룹 정책)를 사용하여 RDP 세션의 지속 시간 제한을 설정할 수도 있습니다.

Windows 10에서 RDP Wrapper가 작동하지 않을 때

경우에 따라 RDP Wrapper 도구가 예상대로 작동하지 않아 여러 RDP 세션으로 Windows 호스트에 접속할 수 없는 경우가 있습니다.

유틸리티의 상태 섹션에 [not supported]가 표시된다면, rdpwrap.ini 파일에 사용 중인 Windows 빌드에 대한 구성이 없다는 뜻입니다. 앞서 설명한 대로 rdpwrap.ini 파일을 업데이트하세요.

rdpwrap.ini 파일을 업데이트한 후에도 RDP Wrapper가 작동하지 않으면, 파일을 열어 사용 중인 Windows 버전에 대한 설명 섹션이 있는지 확인해 보세요. rdpwrapper 구성 파일에 내 Windows 버전 지원 여부는 어떻게 알 수 있을까요?

아래 스크린샷은 필자의 Windows 10 버전(10.0.19041.1320)에 대한 두 개의 설명 섹션이 존재함을 보여줍니다.

[10.0.19041.1320]
…..

[10.0.19041.1320-SLInit]
…..

구성 파일에 사용 중인 Windows 버전에 대한 섹션이 없다면, Google에서 해당 Windows 빌드의 rdpwrap.ini 문자열을 검색해 보세요. 찾은 내용을 파일 끝에 추가하면 됩니다.

RDPWrapper에 문제가 있다면 https://github.com/stascorp/rdpwrap/issues 에서 이슈를 등록할 수 있습니다. 여기서 최신 rdpwrap.ini 파일도 찾을 수 있습니다.

보안 업데이트 설치 또는 Windows 10 빌드 업그레이드 후 RDP Wrapper가 올바르게 작동하지 않는다면, Diagnostics 섹션에 "Listener state: Not listening"이 표시되는지 확인하세요.

rdpwrap.ini 파일을 업데이트한 후 서비스를 재설치해 보세요.

rdpwinst.exe -u
rdpwinst.exe -i

다른 사용자 계정으로 두 번째 RDP 연결을 시도할 때 다음과 같은 경고가 표시되는 경우도 있습니다.

이 컴퓨터에 대한 연결 수가 제한되어 있으며 현재 모든 연결이 사용 중입니다. 나중에 다시 연결하거나 시스템 관리자에게 문의하세요.

이 경우 로컬 그룹 정책 편집기(gpedit.msc)를 열어 Computer Configuration → Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Session Host → Connections 섹션에서 "Limit number of connections(연결 수 제한)" 정책을 활성화하고 값을 999999로 변경합니다.

GPO를 적용하고 설정을 반영하려면 컴퓨터를 재시작하세요.

termsrv.dll 수정으로 다중 RDP 세션 활성화

rdpwrapper를 사용하지 않고 Windows 10의 동시 RDP 사용자 연결 수 제한을 제거하려면 원본 termsrv.dll 파일을 교체하는 방법이 있습니다. 이 파일은 원격 데스크톱 서비스가 사용하는 핵심 라이브러리 파일로, C:\Windows\System32 디렉터리에 위치합니다.

termsrv.dll 파일을 편집하거나 교체하기 전에 백업 복사본을 만드는 것이 좋습니다. 필요할 경우 원본 버전으로 되돌릴 수 있습니다. 관리자 권한 명령 프롬프트를 열고 다음 명령을 실행합니다.

copy c:\Windows\System32\termsrv.dll termsrv.dll_backup

다음으로 파일 소유권을 가져와야 합니다. TrustedInstaller에서 로컬 Administrators 그룹으로 파일 소유자를 변경하는 명령입니다.

takeown /F c:\Windows\System32\termsrv.dll /A

SUCCESS: The file (or folder): c:\Windows\System32\termsrv.dll now owned by the administrators group

이제 icacls.exe를 사용하여 로컬 관리자 그룹에 termsrv.dll 파일에 대한 모든 권한(Full Control)을 부여합니다.

icacls c:\Windows\System32\termsrv.dll /grant Administrators:F

processed file: c:\Windows\System32\termsrv.dll Successfully processed 1 files; Failed processing 0 files.

그런 다음 services.msc 콘솔이나 명령 프롬프트에서 원격 데스크톱 서비스(TermService)를 중지합니다.

Net stop TermService

이때 원격 데스크톱 서비스 사용자 모드 포트 리디렉터 서비스도 함께 중지됩니다.

진행하기 전에 사용 중인 Windows 10의 버전(빌드 번호)을 확인해야 합니다. PowerShell 콘솔을 열고 다음 명령을 실행합니다.

Get-ComputerInfo | select WindowsProductName, WindowsVersion

필자의 경우 Windows 10 빌드 21H1이 설치되어 있습니다.

이제 아무 HEX 편집기(예: Tiny Hexer)로 termsrv.dll 파일을 엽니다. 사용 중인 Windows 빌드에 따라 아래 표를 참조하여 문자열을 찾아 교체합니다.

Windows 빌드찾을 문자열교체할 문자열
Windows 11 RTM (21H2 – 22000.258)39 81 3C 06 00 00 0F 84 4F 68 01 00B8 00 01 00 00 89 81 38 06 00 00 90
Windows 10 x64 21H239 81 3C 06 00 00 0F 84 DB 61 01 00
Windows 10 x64 21H139 81 3C 06 00 00 0F 84 2B 5F 01 00
Windows 10 x64 20H239 81 3C 06 00 00 0F 84 21 68 01 00
Windows 10 x64 200439 81 3C 06 00 00 0F 84 D9 51 01 00
Windows 10 x64 190939 81 3C 06 00 00 0F 84 5D 61 01 00
Windows 10 x64 190339 81 3C 06 00 00 0F 84 5D 61 01 00
Windows 10 x64 180939 81 3C 06 00 00 0F 84 3B 2B 01 00
Windows 10 x64 18038B 99 3C 06 00 00 8B B9 38 06 00 00
Windows 10 x64 170939 81 3C 06 00 00 0F 84 B1 7D 02 00

Tiny Hexer 편집기는 system32 폴더에서 직접 termsrv.dll 파일을 편집할 수 없습니다. 파일을 바탕 화면으로 복사한 후 수정하고, 수정이 완료되면 원본 위치로 다시 교체하세요.

예를 들어 필자의 Windows 10 x64 빌드는 21H1(19043.1320)이며 termsrv.dll 파일 버전은 10.0.19041.1320입니다. Tiny Hexer에서 termsrv.dll 파일을 열고 다음 문자열을 찾습니다.

39 81 3C 06 00 00 0F 84 2B 5F 01 00

그리고 다음으로 교체합니다.

B8 00 01 00 00 89 81 38 06 00 00 90

파일을 저장하고 TermService 서비스를 시작합니다.

문제가 발생하여 원격 데스크톱 서비스에 오류가 생긴다면, 서비스를 중지하고 수정된 termsrv.dll 파일을 원본 버전으로 교체하세요.

copy termsrv.dll_backup c:\Windows\System32\termsrv.dll

PowerShell로 termsrv.dll 자동 패치하기

HEX 편집기로 termsrv.dll 파일을 수동으로 수정하는 대신, 다음 PowerShell 스크립트를 사용하면 패치를 자동으로 적용할 수 있습니다. 이 스크립트는 Windows PowerShell 버전 기반이며 최신 PowerShell Core에서는 작동하지 않습니다. 스크립트는 범용적이어서 Windows 10(1809+) 및 Windows 11의 모든 에디션에서 termsrv.dll 파일을 패치하는 데 사용할 수 있습니다.

# RDP 서비스 중지, termsrv.dll 백업 및 권한 변경
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
# 원본 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

전체 스크립트 코드는 GitHub 저장소 https://github.com/maxbakhub/winposh/blob/main/termsrv_rdp_patch.ps1 에서 확인할 수 있습니다.

스크립트를 실행하려면 컴퓨터에 다운로드한 후, 현재 세션에 대한 PowerShell 실행 정책을 변경합니다.

Set-ExecutionPolicy Bypass -Scope Process -Force

그리고 스크립트를 실행합니다.

C:\users\root\desktop\termsrv_rdp_patch.ps1

이 스크립트는 Windows 업데이트 설치 후에도 실행할 수 있어, 매번 HEX 편집기로 termsrv.dll 파일을 수정할 필요가 없습니다.

termsrv.dll 파일 교체 방식으로 Windows 10 또는 11에서 다중 RDP 세션을 활성화하는 것의 장점은, 많은 백신 프로그램이 Malware/HackTool/Trojan으로 탐지하는 RDPWrap과 달리 백신 프로그램이 반응하지 않는다는 점입니다.

단점은 Windows 10 빌드를 업그레이드할 때마다(또는 월간 누적 업데이트 설치 시 termsrv.dll 파일 버전이 변경될 때마다) termsrv.dll 파일을 수동으로 다시 편집해야 한다는 것입니다. RDPWrapper를 사용하는 경우에도 Windows 업데이트 설치 후 rdpwrap.ini 파일을 업데이트해야 합니다.

이 글에서는 동시 RDP 사용자 연결 수 제한을 제거하고 데스크톱 버전의 Windows에서 무료 터미널 서버를 운영하는 방법을 살펴보았습니다.