Windows Server RDS: The remote session was disconnected because there are no Remote Desktop License Servers available to provide a license
안녕하세요, BlueByte입니다. 어제까지 잘 접속하던 사용자들이 로그인 단계에서 The remote session was disconnected because there are no Remote Desktop License Servers available to provide a license. 로 튕겨 나옵니다. 무엇이 죽은 것도, 업데이트가 돌아간 것도 아닙니다. 라이선싱 유예 기간이 지난 Remote Desktop Session Host 는 라이선스 서버가 클라이언트 액세스 라이선스를 발급해 줄 때까지 의도적으로 세션을 거부합니다. 오늘은 메시지 변형들, 호스트가 거부를 시작한 이유, 명령 두어 개로 원인을 확정하는 법, 원인별 해결, 그리고 업그레이드 뒤에 같은 벽을 다시 만나지 않는 방법까지 하나씩 짚어보겠습니다.
사용자가 보는 메시지와 진단기가 덧붙이는 두 문장
클라이언트에는 위의 라이선싱 문구, 또는 Access was denied because of a security error. 둘 중 하나가 뜹니다. 뒤쪽은 원인이 다르고 글 끝에서 따로 다룹니다. 쓸 만한 정보는 서버 쪽에 있습니다. 세션 호스트에 도메인 관리자로 로그인해 RD Licensing Diagnoser 를 여세요(Server Manager → Tools → Terminal Services → RD Licensing Diagnoser). 진단기는 문제를 말로 적어 줍니다. 예를 들어 The grace period for the Remote Desktop Session Host server has expired, but the RD Session Host server hasn't been configured with any license servers. Connections to the RD Session Host server will be denied unless a license server is configured for the RD Session Host server. 또는 License server <computer name> is not available. This could be caused by network connectivity problems, the Remote Desktop Licensing service is stopped on the license server, or RD Licensing isn't available. 입니다. 이 두 문장이 "라이선스 서버가 설정되지 않음" 과 "설정은 됐는데 닿지 않음" 을 갈라 줍니다. 진단의 첫 갈림길입니다.
세션 호스트가 접속을 거부하기 시작한 이유
라이선스 서버 없이 지낼 수 있는 유예 기간은 120일입니다. 이 기간이 끝나면 클라이언트는 라이선스 서버가 발급한 유효한 RDS CAL 이 있어야 원격 세션에 로그인할 수 있습니다. 잘 돌던 파일럿 환경이 넉 달 뒤 장애로 바뀌는 지점이 바로 이 마감일입니다. 원인은 이렇게 갈립니다.
- 유예 기간이 끝났는데 라이선스 서버가 아예 설정돼 있지 않은 경우.
- 라이선스 서버는 지정돼 있지만 활성화되지 않았거나, 이 배포에 쓸 CAL 이 없는 경우.
- CAL 이 세션 호스트에 비해 낮은 버전인 경우. 새 CAL 이 옛 호스트를 서비스하지, 그 반대는 되지 않습니다. Windows Server 2022 CAL 은 2022·2019·2016 호스트에서 동작하고 2025 호스트에서는 거부됩니다.
- 워크그룹 배포인데 Per User 를 고른 경우. Per User CAL 은 워크그룹에서 추적할 수 없고 허용되지도 않습니다. 워크그룹 배포는 Per Device 를 써야 합니다.
- 설정도 정상이고 서버도 멀쩡한데 닿지 않는 경우. RPC 포트가 막혔거나 Remote Desktop Licensing 서비스가 멈춰 있습니다.
세션 호스트에게 자기 라이선싱 상태를 물어보기
명령 두 개면 어느 원인인지 갈립니다. Win32_TerminalServiceSetting 은 Root\CIMv2\TerminalServices 네임스페이스에 있고, GetGracePeriodDays 메서드는 값이 0 이면 유예 기간이 끝났다는 뜻이라고 문서에 적혀 있습니다.
$ts = Get-CimInstance -Namespace root/cimv2/TerminalServices -ClassName Win32_TerminalServiceSetting
$ts | Select-Object ServerName, TerminalServerMode, LicensingType, PolicySourceLicensingType
Invoke-CimMethod -InputObject $ts -MethodName GetGracePeriodDays
Invoke-CimMethod -InputObject $ts -MethodName GetSpecifiedLicenseServerListServerName : RDSH01
TerminalServerMode : 1
LicensingType : 4
PolicySourceLicensingType : 0
DaysLeft ReturnValue
-------- -----------
0 0
SpecifiedLSList ReturnValue
--------------- -----------
{} 0문서의 값 정의에 맞춰 읽으시면 됩니다. TerminalServerMode 1 은 이 호스트가 애플리케이션 서버로 동작한다는 뜻이므로 CAL 이 적용됩니다. LicensingType 4 는 Not Configured 이고, 2 는 Per Device, 3 은 Per User 입니다. PolicySourceLicensingType 0 은 설정이 서버에서 왔다는 뜻, 1 은 그룹 정책이 결정하고 있다는 뜻입니다. 엉뚱한 곳을 고치기 전에 알아 두면 좋은 값입니다. SpecifiedLSList 가 비어 있고 DaysLeft 가 0 이면 교과서적인 사례입니다. 유예는 끝났고 설정된 것은 없습니다.
활성화된 라이선스 서버를 배포에 지정하기
RD Connection Broker 가 있는 배포라면 그쪽에서 지정합니다. Server Manager → Remote Desktop Services → Overview → Edit Deployment Properties → RD Licensing 에서 하거나, 한 줄로 끝낼 수도 있습니다.
Set-RDLicenseConfiguration -LicenseServer @("Rdl-1.Contoso.com","Rdl-2.Contoso.com") `
-Mode PerUser -ConnectionBroker "Rdcb.Contoso.com" -Force-Mode 는 PerDevice·PerUser·NotConfigured 를 받고, 현재 설정은 Get-RDLicenseConfiguration 으로 읽어 볼 수 있습니다.
브로커 없이 RD Session Host 와 RD Licensing 역할만 있는 호스트라면 설정은 정책에 있습니다. gpedit.msc 를 열고 Computer Configuration → Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Session Host → Licensing 으로 갑니다. Use the specified Remote Desktop license servers 를 Enabled 로 두고 서버 이름을 넣으세요. 여러 대면 쉼표로 구분합니다. 이어서 Set the Remote Desktop licensing mode 를 Enabled 로 두고 Per Device 나 Per User 를 고릅니다. 어느 쪽이든 그 전에 RD Licensing Manager 에서 라이선스 서버가 활성화됐는지, CAL 수량이 실제 값인지 확인하세요. 서버 이름 옆의 녹색 체크와, 구매한 수량과 맞아떨어지는 총계·가용 수치가 기준입니다.
CAL 버전이 세션 호스트를 감당하는지 확인하기
이 항목은 업그레이드 때 사람을 잡습니다. 배포 설정에는 잘못된 곳이 하나도 없어 보이기 때문입니다. 2019 라이선스 서버에는 2022·2025 CAL 을 담을 수 없고, 2022 CAL 로는 2025 세션 호스트를 서비스할 수 없습니다. CAL 은 같은 버전이거나 더 높은 버전의 Windows Server 라이선스 서버에 설치하고, CAL 버전이 최소한 감당할 호스트 버전 이상인지 확인하세요. 2022 CAL 로 운영하던 팜에 Windows Server 2025 세션 호스트를 한 대 넣으면, 나머지 호스트는 멀쩡한데 그 호스트만 세션을 거부하기 시작합니다.
설정은 맞는데 서버에 닿지 않을 때
세션 호스트와 라이선스 서버 사이에서 RD Licensing 은 RPC 로 통신합니다. 엔드포인트 매퍼용 TCP 135, 그리고 Windows Server 2008 이상에서 무작위로 할당되는 동적 범위 TCP 49152–65535 가 필요하고, SMB 와 NetBIOS 세션용 TCP 445·139, Active Directory 에서 per-user CAL 을 쓸 때의 TCP/UDP 389 가 따라붙습니다. 인터넷을 통한 Microsoft Clearing House 활성화에는 TCP 443 을 씁니다.
Test-NetConnection -ComputerName Rdl-1.Contoso.com -Port 135
Get-Service -DisplayName "Remote Desktop Licensing" -ComputerName Rdl-1.Contoso.comComputerName : Rdl-1.Contoso.com
RemoteAddress : 10.20.4.11
RemotePort : 135
TcpTestSucceeded : True
Status Name DisplayName
------ ---- -----------
Running TermServLicensing Remote Desktop Licensing이런 유형의 실패에는 설정 하나가 더 숨어 있습니다. Computer Configuration → Windows Settings → Security Settings → Local Policies → User Rights Assignment 아래의 Access this computer from the network 권한입니다. Everyone 이 할당돼 있지 않다면 Authenticated Users, Domain Computers, 또는 세션 호스트의 컴퓨터 계정에 이 권한을 주세요.
실제 사례: Windows Server 2022 팜의 121일째
5월에 파일럿으로 세운 두 대짜리 팜이 조용히 운영 환경이 됐습니다. 9월 어느 화요일, 기존 세션은 유지되는데 새 접속만 전부 라이선싱 메시지로 실패합니다. 진단기는 유예 기간 만료와 라이선스 서버 미설정을 보고합니다. GetGracePeriodDays 의 DaysLeft 는 0, GetSpecifiedLicenseServerList 는 빈 배열, LicensingType 은 4 입니다. 다행히 다른 프로젝트에서 사 둔 2022 CAL 이 있어서, 팀은 브로커에 라이선싱 역할을 활성화하고 CAL 팩을 설치한 뒤 RD Licensing Manager 의 녹색 체크를 확인하고 Set-RDLicenseConfiguration 을 -Mode PerUser 와 라이선스 서버 두 대로 실행합니다. 재접속한 사용자는 곧바로 들어옵니다. 뒷정리도 그만큼 중요했습니다. 예정돼 있던 2025 세션 호스트 도입은 2025 CAL 을 확보할 때까지 보류됐습니다. 기존 2022 CAL 로는 그 호스트를 서비스할 수 없기 때문입니다.
CAL 이 실제로 발급되는지 확인하고 그 상태를 유지하기
진단기를 다시 돌려 문제 목록이 비는지 보세요. WMI 블록도 다시 실행해 LicensingType 이 4 가 아니라 2 나 3 으로 바뀌었는지, SpecifiedLSList 에 서버가 들어왔는지 확인합니다. 그다음 며칠 동안 RD Licensing Manager 를 지켜보면 사용자가 로그인할수록 발급된 CAL 수가 올라가야 합니다. Per Device 는 이 과정이 눈에 보입니다. 장치가 처음 접속하면 90일짜리 임시 CAL 이 발급되고, 라이선스 서버가 활성화돼 있고 CAL 이 남아 있으면 52~89일 사이의 무작위 기간을 갖는 영구 CAL 로 올라가며, 만료가 7일 안으로 들어오면 세션 호스트가 갱신합니다. Per User 는 강제되지 않고 라이선스 계약을 위반하는 과다 할당까지 가능하므로, 로그인이 되는 것만 믿지 말고 Remote Desktop Licensing Manager 에서 사용량을 직접 추적하세요.
licensing mode 경고·security error 변형과의 차이
접속은 되는데 Remote Desktop licensing mode is not configured. Remote Desktop Services will stop working because this computer is past its licensing grace period. 라는 풍선 알림만 뜬다면 아직 이른 단계입니다. 모드가 설정되지 않았을 뿐 접속은 당분간 유지되고, 월요일 아침 9시가 아니라 여유 있을 때 라이선싱을 제대로 잡을 시간이 있습니다. 다른 변형인 Access was denied because of a security error. 는 대개 CAL 가용성과 무관하고, 손상된 라이선싱 인증서 쪽입니다. 문서화된 복구는 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM 아래의 Certificate, X509 Certificate, X509 Certificate ID, X509 Certificate2 값을 백업한 뒤 삭제하고 컴퓨터를 재시작한 다음 라이선스 서버를 다시 활성화하는 것입니다. 겁먹지 않아도 되지만 키 내보내기는 먼저 하세요. 지원 문서가 그 단계를 굳이 적어 둔 이유가 있습니다.
다음에 라이선싱 메시지에서 세션이 멈추면 이 순서를 거꾸로 따라가 보세요. 진단기가 무엇이라고 말하는지, GetGracePeriodDays 와 GetSpecifiedLicenseServerList 가 무엇을 돌려주는지, 라이선스 서버가 활성화돼 있고 호스트를 감당할 만큼 새 CAL 을 갖고 있는지를 본 뒤에야 네트워크를 들여다보면 됩니다.
관련 질문
120일 유예 기간을 연장하거나 초기화할 수 있나요?
한 번뿐인 허용으로 보셔야 합니다. Microsoft 문서는 라이선스 서버 없이 지낼 수 있는 유예 기간이 120일이며, 그 기간이 끝나면 클라이언트는 라이선스 서버가 발급한 유효한 RDS CAL 이 있어야 원격 세션에 로그인할 수 있다고 적고 있습니다. 연장하는 지원 경로는 없습니다. 지원되는 길은 RD Licensing 서버를 활성화하고 CAL 을 설치하는 것이며, 라이선스 약관 안에 머무르는 길도 그것뿐입니다.
관리용 세션 두 개만 쓰는데 CAL 이 필요한가요?
짐작하기 전에 호스트가 어느 모드인지부터 확인하세요. WMI 출력에서 TerminalServerMode 0 은 RemoteAdmin, 1 은 AppServer 이고, LicensingType 1 은 Remote Desktop for Administration, 2 와 3 은 애플리케이션 서버의 Per Device·Per User 모드입니다. RD Session Host 역할을 설치한 서버는 애플리케이션 서버이고, 유예 기간이 끝나 세션이 거부되기 시작하는 것이 바로 그 경우입니다.
워크그룹 서버에서 Per User CAL 을 쓸 수 있나요?
안 됩니다. Per User CAL 은 Active Directory 의 사용자에게 할당되며 워크그룹에서는 추적할 수 없어 허용되지 않습니다. 그 환경에서는 장치에 할당되고 Active Directory 소속과 무관하게 라이선스 서버가 추적하는 Per Device CAL 을 쓰세요. 도메인에 가입된 배포에서는 둘 다 쓸 수 있습니다.
라이선스 서버에 CAL 을 설치했는데도 호스트가 세션을 거부합니다.
다음은 버전 짝을 확인할 차례입니다. CAL 은 자기 버전이거나 더 낮은 버전의 세션 호스트를 서비스할 수 있고 더 높은 버전은 못 합니다. 또 CAL 은 같은 버전이거나 더 높은 버전의 Windows Server 라이선스 서버에 설치해야 합니다. 2022 라이선스 서버의 2022 CAL 로는 2025 세션 호스트를 라이선싱할 수 없고, 2025 CAL 은 2022 라이선스 서버에 설치되지 않습니다. RD Licensing Diagnoser 는 이것을 연결 문제가 아니라 라이선싱 문제로 보고합니다.
Per Device CAL 만료일이 왜 제각각인가요?
갱신이 한꺼번에 몰리지 않도록 의도된 동작입니다. 임시 Per Device CAL 은 장치가 처음 로그인할 때 발급되어 90일 동안 유효하고, 영구 CAL 은 52~89일 사이의 무작위 기간을 가지며 만료일이 7일 안으로 들어오면 세션 호스트가 라이선스 서버와 갱신합니다. Per User 는 동작이 달라서 발급 60일 뒤 만료로 표시되고 다음 로그인 때 연장됩니다.
참고 자료
- Microsoft Learn — Cannot connect to RDS because no RD Licensing servers are available (diagnoser messages, deployment and Group Policy licensing configuration, X509 certificate refresh)
- Microsoft Learn — License Remote Desktop Services with Client Access Licenses (CALs) (120-day grace period, Per User and Per Device behaviour, CAL and license server version compatibility)
Haneul Seo
Infrastructure engineer · 10+ years running Linux fleets
같은 카테고리 다른 글
systemd: Start request repeated too quickly
systemd는 StartLimitIntervalSec(기본 10초) 안에 StartLimitBurst(기본 5회)보다 많이 시작된 유닛의 시작을 거부하며, Restart=도 이 제한에 포함됩니다. 기본 RestartSec 100ms로는 크래시하는 서비스가 1초도 안 되어 다섯 번을 소진합니다. 저널에서 진짜 크래시를 찾아 고치고, reset-failed를 실행한 뒤, RestartSec로 재시작에 여유를 주세요.
SSH: Received disconnect ... Too many authentication failures
agent가 서버가 허용하는 것보다 많은 키를 내밀고 있습니다. sshd가 들여다보는 공개키 하나하나가 MaxAuthTries 시도를 한 번씩 소모하고 — 기본 6회, 하드닝된 호스트에서는 3회인 경우가 많습니다 — 정작 맞는 키는 차례가 오기 전에 연결이 끊깁니다. IdentitiesOnly=yes와 명시적 IdentityFile로 키 하나를 고정하면 시도 횟수가 1로 떨어집니다.
Active Directory: 복제가 error 1722(The RPC server is unavailable)로 실패
RPC는 하위 계층이 연결에 실패했을 때 1722(0x6ba, RPC_S_SERVER_UNAVAILABLE)를 보고합니다. 따라서 진짜 원인은 RPC 자신이 아니라 DNS, 차단된 포트, 두 도메인 컨트롤러 중 한쪽의 호스트 설정입니다. repadmin이 어느 파트너가 실패하는지 알려주고, dcdiag /test:dns가 이름 해석을 배제하며, Test-NetConnection과 동적 포트 범위가 방화벽 문제를 가릅니다. 가장 흔한 실수는 TCP 135만 허용하고 49152–65535는 막아 둔 규칙입니다.
Windows 11: NAS 공유 폴더를 열 때 "조직의 보안 정책이 인증되지 않은 게스트 액세스를 차단" (0x80070035)
Windows 10 Enterprise/Education/Pro for Workstations, Windows 11 Pro, Windows Server 2019 이후의 SMB 클라이언트는 기본적으로 게스트 로그온을 거부하고, Windows 11 24H2 Enterprise/Pro/Education 은 게스트 세션이 할 수 없는 SMB 서명까지 요구합니다. 그래서 게스트 접근만 제공하는 NAS 공유는 'block unauthenticated guest access' 대화상자, Error code 0x80070035, 또는 System error 3227320323 으로 실패하고, SmbClient/Security 로그에 Event ID 31017 'Rejected an insecure guest logon' 이 남습니다. Microsoft 가 권하는 해결은 NAS 에 실제 계정을 만들고 펌웨어에서 서명을 지원하게 하는 것입니다. Set-SmbClientConfiguration -EnableInsecureGuestLogons $true(24H2 는 -RequireSecuritySignature $false 까지)는 비상구이며, 그 클라이언트의 서명과 암호화를 포기하는 대가가 있습니다.
Ubuntu/Debian: E: Could not get lock /var/lib/dpkg/lock-frontend — 누가 쥐고 있고 어떻게 기다리는지
다른 패키지 관리자, 대개 부팅 때 persistent systemd 타이머로 발화한 Ubuntu 의 unattended-upgrades 가 여러분의 apt-get 이 도는 동안 dpkg 프런트엔드 락을 쥐고 있는 것입니다. Ubuntu 는 apt 바이너리에만 binary::apt::DPkg::Lock::Timeout "120" 을 실어 두어서 apt-get 은 즉시 포기하고 apt 는 기다립니다. 메시지의 PID 를 읽고, 실행이 끝나게 두거나 apt-get 에 -o DPkg::Lock::Timeout=<초> 를 주고, dpkg --configure -a 는 실제로 중단된 실행 뒤에만 쓰고, 락 파일은 절대 지우지 마세요. 보유자가 종료하면 커널이 푸는 fcntl 락입니다.
macOS: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)
macOS의 /usr/bin에 있는 git·make·clang 같은 개발 명령은 활성 developer 디렉터리로 넘겨주는 shim이고, xcrun은 xcode-select가 가리키는 디렉터리에 도구가 없다고 보고하는 것입니다 — 대개 macOS 메이저 업그레이드가 /Library/Developer/CommandLineTools를 비워 두었거나, Xcode가 옮겨지거나 삭제된 경우입니다. xcode-select -p와 패키지 영수증을 확인한 뒤 xcode-select --install로 Command Line Tools를 다시 설치하거나, 실제로 있는 Xcode를 xcode-select로 가리키면 됩니다.