섀도 세션 모드(Shadow Session Mode)는 RDS 관리자가 사용자의 데스크톱 화면을 실시간으로 보거나 직접 조작할 수 있도록 지원하는 강력한 기능입니다. 원격 데스크톱 섀도잉(Remote Desktop Shadowing)은 Windows 8.1 및 Windows Server 2012 R2 이상의 모든 최신 Windows 버전에서 작동합니다(단, RDP 스택이 커널 모드에서 사용자 모드로 전환된 Windows Server 2012는 예외입니다). 이 글에서는 Windows Server 2016과 Windows 10 환경에서 RDS 섀도잉을 구성하고 활성화된 RDP 사용자 세션에 연결하여 관리하는 방법을 자세히 살펴보겠습니다.
목차
- RDP 클라이언트(mstsc.exe)의 섀도 연결 옵션
- Windows GUI를 통한 원격 데스크톱 섀도 사용법
- GPO를 활용한 Windows RDS 섀도 규칙 구성
- PowerShell로 RDP 세션 섀도잉하기
- 비관리자 사용자에게 RDS 세션 섀도 권한 부여하는 방법
RDP 클라이언트(mstsc.exe)의 섀도 연결 옵션
Windows Server 2016/Windows 10의 내장 RDP 클라이언트(mstsc.exe)에는 다른 사용자의 활성 RDP 세션에 원격으로 섀도 연결할 수 있는 특수 옵션이 여러 개 포함되어 있습니다.
Mstsc.exe [/shadow:sessionID [/v:Servername] [/control] [/noConsentPrompt] [/prompt]]

각 매개변수의 의미는 다음과 같습니다.
- /shadow:ID – 지정한 세션 ID를 가진 사용자의 RDP 세션에 연결합니다.
- /v:servername – 원격 RDP/RDS 호스트의 호스트명 또는 IP 주소를 지정할 수 있습니다. 값을 입력하지 않으면 현재 호스트의 로컬 사용자 세션에 연결됩니다.
- /control – 사용자 세션(데스크톱)과의 상호 작용을 허용합니다. 관리자는 사용자의 마우스를 제어하고 키보드로 데이터를 입력할 수 있습니다. 이 매개변수를 생략하면 사용자 세션을 보기만 하는 뷰(View) 모드로 연결됩니다.
- /noConsentPrompt – 사용자에게 연결 확인을 요청하지 않고 강제로 세션에 연결하는 옵션입니다.
- /prompt – 다른 자격 증명으로 연결할 수 있게 해줍니다. 원격 컴퓨터에 접속할 때 사용자 이름과 암호를 묻습니다.
섀도 세션은 Active Directory 도메인 환경뿐 아니라 작업 그룹(Workgroup) 환경의 컴퓨터와 서버에서도 사용할 수 있습니다. 또한 사용자의 RDP 세션이 실행 중인 RDS 호스트에 대한 관리자 권한이 반드시 필요한 것은 아닙니다. 관리자는 일반 사용자 계정에도 RDS 섀도잉 권한을 위임할 수 있습니다(자세한 내용은 아래에서 설명).
Windows GUI를 통한 원격 데스크톱 섀도 사용법
mstsc.exe 명령어 대신 서버 관리자(Server Manager) 그래픽 콘솔에서 바로 사용자 세션에 연결할 수도 있습니다. RDS 서버에서 서버 관리자 콘솔을 열고 원격 데스크톱 서비스(Remote Desktop Services) 섹션으로 이동한 후, 컬렉션(예: QuickSessionCollection)을 선택합니다.

오른쪽 목록에는 해당 RDS 서버에 세션이 있는 사용자들이 표시됩니다. 섀도 연결을 원하는 사용자 세션을 마우스 오른쪽 버튼으로 클릭하고 드롭다운 메뉴에서 섀도(Shadow)를 선택합니다.

단, 활성(Active) 상태의 사용자 세션에만 연결할 수 있다는 점에 유의하세요. RDS 세션 제한 시간 설정 등으로 인해 연결이 끊긴(Disconnected) 상태의 세션에는 접속할 수 없으며, 다음과 같은 오류가 발생합니다.
Shadow Error - The specified session is not connected.

그러면 섀도 연결 파라미터 창이 나타납니다. 여기서 사용자의 RDP 세션을 보기(View)할지 제어(Control)할지 선택할 수 있으며, 사용자 동의 요청(Prompt for user consent) 옵션도 함께 체크할 수 있습니다.

이 옵션에 체크하면 사용자의 RDP 세션에 다음과 같은 확인 요청 팝업이 표시됩니다.
Remote Monitoring Request woshub\administrator is requesting to view your session remotely. Do you accept the request?

사용자가 연결을 승인하면 관리자는 보기(View) 모드로 해당 데스크톱을 볼 수 있지만, 화면을 직접 조작할 수는 없습니다.

팁: 사용자 세션에서 연결을 종료하고 섀도 모드를 빠져나오려면 워크스테이션에서는 ALT+*, RDS 서버에서는 Ctrl+* 키를 누르면 됩니다(별도의 단축키 조합을 지정하지 않은 경우).
사용자가 관리자의 섀도 연결 요청을 거부하면 다음과 같은 메시지가 표시됩니다.
Shadow Error: The operator or administrator has refused the request.

참고로, Windows Server 2008 R2의 tsadmin.msc 그래픽 스냅인을 사용해서는 최신 버전의 Windows Server에서 RDP 세션에 섀도 연결할 수 없습니다.
사용자 확인 절차 없이 세션에 연결을 시도하면 다음 오류 메시지가 나타납니다.
Shadow Error: The Group Policy setting is configured to require the user's consent. Verify the configuration of the policy settings.

사용자 세션에 대한 RDS 섀도 연결 이벤트를 감사(audit)해야 한다면, Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational 로그에서 다음 필터링된 이벤트를 활용하세요.
- 이벤트 ID 20508: 섀도 보기 권한 부여됨(Shadow View Permission Granted)
- 이벤트 ID 20503: 섀도 보기 세션 시작됨(Shadow View Session Started)
- 이벤트 ID 20504: 섀도 보기 세션 중지됨(Shadow View Session Stopped)

GPO를 활용한 Windows RDS 섀도 규칙 구성
RDS 사용자 세션에 대한 원격 연결 설정은 그룹 정책 매개변수 "Set rules for remote control of Remote Desktop Services user sessions"(원격 데스크톱 서비스 사용자 세션의 원격 제어 규칙 설정)을 통해 구성합니다. 이 정책은 GPO의 사용자 및 컴퓨터 섹션에서 Policies → Administrative Templates → Windows Components → Remote Desktop Services → Remote Session Host → Connections 경로에서 찾을 수 있습니다. 이 정책은 레지스트리 키 HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services 아래의 DWORD 값 Shadow와 대응됩니다(괄호 안의 값이 각 정책 설정에 해당하는 레지스트리 값입니다).
이 정책으로 구성할 수 있는 RD 섀도 연결 옵션은 다음과 같습니다.
- 원격 제어 허용 안 함(레지스트리 값
Shadow = 0) - 사용자 권한과 함께 전체 제어(Full Control with user's permission)(
1) - 사용자 권한 없이 전체 제어(Full Control without user's permission)(
2) - 사용자 권한과 함께 세션 보기(View Session with user's permission)(
3) - 사용자 권한 없이 세션 보기(View Session without user's permission)(
4)
레지스트리를 통해 이 정책 값을 직접 설정하려면 다음 명령을 사용할 수 있습니다.
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v Shadow /t REG_DWORD /d 4

세션 섀도 동작을 변경한 후에는 RDP/RDS 호스트에서 그룹 정책 설정을 갱신(gpupdate)해야 적용됩니다.
AD 도메인 환경에서는 gpmc.msc 콘솔에서 위에서 설명한 정책 매개변수를 사용해 원격 섀도 연결 규칙을 구성하거나, 레지스트리 값을 직접 수정하는 GPP(Group Policy Preferences)를 활용할 수 있습니다. 후자의 방식은 항목 수준 대상 지정(Item Level Targeting)을 통해 특정 컴퓨터에만 더 정밀하게 정책을 적용할 수 있다는 장점이 있습니다.
PowerShell로 RDP 세션 섀도잉하기
PowerShell에서도 원격 데스크톱 서비스의 섀도 기능을 사용해 사용자 세션에 연결할 수 있습니다. 먼저 RDS 호스트의 세션 목록을 조회해야 합니다(사용자 세션은 상태별로 그룹화되어 표시됩니다).
Get-RDUserSession | ft Username, UnifiedSessionId, SessionState, HostServer, ApplicationType -GroupBy Sessionstate

예를 들어 이 서버에는 3개의 활성 RDP 사용자 세션이 있습니다. 세션 ID가 3인 사용자 세션에 연결하려면 다음 명령을 실행합니다.
Mstsc /shadow:3 /control
또한 서버(또는 여러 RDP 연결을 허용하도록 설정된 Windows 10 데스크톱)의 모든 RDP 세션 목록을 확인하려면 다음 명령을 사용할 수 있습니다.
quser
또는
qwinsta
화면에 RDP 사용자 세션 목록과 함께 각 세션의 ID 및 상태(Active 또는 Disconnected)가 표시됩니다.

원격 서버의 세션 목록을 조회하려면 다음 명령을 실행합니다.
query session /server:servername
원격 서버의 사용자 세션에 연결하려면 다음 명령을 사용합니다.
mstsc /v:rdsh2:3389 /shadow:3 /control
흥미로운 점은 원격 섀도 연결 세션을 설정할 때 기본 RDP 포트인 TCP/3389가 아니라 RPC 동적 포트 범위인 49152~65535가 사용된다는 것입니다.
RDP 사용자 세션에 더 편리하게 섀도 연결하려면 다음 배치 스크립트를 활용할 수 있습니다. 이 스크립트는 원격 RDS 서버 이름 입력을 요청하고, 전체 세션 목록을 표시한 뒤 연결할 세션(ID)을 지정하도록 안내합니다.
shadow.bat
@echo off set /P rcomp="Enter name or IP of a Remote PC: " query session /server:%rcomp% set /P rid="Enter RDP user ID: " start mstsc /shadow:%rid% /v:%rcomp% /control
이 bat 파일을 %Windir%\System32 디렉터리에 저장해 두면, 이후에는 shadow 명령 한 번으로 간편하게 섀도 연결을 시작할 수 있습니다.
콘솔 세션에 연결하려면 다음 스크립트를 사용하세요.
shadow_console.bat
@echo off
set /P rcomp="Enter name or IP of a Remote PC: "
for /f "tokens=3 delims= " %%G in ('query session console /server:%rcomp%') do set rid=%%G
start mstsc /shadow:%rid% /v:%rcomp% /control간단한 GUI가 포함된 다음 PowerShell 스크립트(shadow_user_rdp_session.ps1)를 사용하는 방법도 있습니다.
Add-Type -assembly System.Windows.Forms
$Header = "SESSIONNAME", "USERNAME", "ID", "STATUS"
$gForm = New-Object System.Windows.Forms.Form
$gForm.Text ='Shadow Session Connect'
$gForm.Width = 400
$gForm.AutoSize = $true
$dBttn = New-Object System.Windows.Forms.Button
$dBttn.Text = 'Control'
$dBttn.Location = New-Object System.Drawing.Point(15,10)
$gForm.Controls.Add($dBttn)
$dList = New-Object System.Windows.Forms.ListView
$dList.Location = New-Object System.Drawing.Point(0,50)
$dList.Width = $gForm.ClientRectangle.Width
$dList.Height = $gForm.ClientRectangle.Height
$dList.Anchor = "Top, Left, Right, Bottom"
$dList.MultiSelect = $False
$dList.View = 'Details'
$dList.FullRowSelect = 1;
$dList.GridLines = 1
$dList.Scrollable = 1
$gForm.Controls.add($dList)
foreach ($column in $Header){
$dList.Columns.Add($column) | Out-Null
}
$(qwinsta.exe | findstr "Active") -replace "^[\s>]" , "" -replace "\s+" , "," | ConvertFrom-Csv -Header $Header | ForEach-Object {
$dListItem = New-Object System.Windows.Forms.ListViewItem($_.SESSIONNAME)
$dListItem.Subitems.Add($_.USERNAME) | Out-Null
$dListItem.Subitems.Add($_.ID) | Out-Null
$dListItem.Subitems.Add($_.STATUS) | Out-Null
$dList.Items.Add($dListItem) | Out-Null
}
$dBttn.Add_Click(
{
$SelectedItem = $dList.SelectedItems[0]
if ($SelectedItem -eq $null){
[System.Windows.Forms.MessageBox]::Show("Select a user session to connect ")
}else{
$session_id = $SelectedItem.subitems[2].text
$(mstsc /shadow:$session_id /control)
#[System.Windows.Forms.MessageBox]::Show($session_id)
}
}
)
$gForm.ShowDialog()이 스크립트를 실행하면 로컬 호스트의 활성 RDP 세션 목록이 담긴 간단한 그래픽 폼이 표시됩니다. 사용자 계정을 선택하고 Connect 버튼만 클릭하면 됩니다.
컴퓨터에서 PowerShell 스크립트(*.ps1)를 실행하려면 PowerShell 실행 정책(Execution Policy)을 사전에 구성해야 합니다.
섀도 사용자 연결은 원격 데스크톱 서비스 역할이 설치된 Windows Server뿐만 아니라, Windows 10이 실행되는 사용자 데스크톱에도 연결하는 데 활용할 수 있습니다.
비관리자 사용자에게 RDS 세션 섀도 권한 부여하는 방법
앞선 예제들에서 RDS 사용자 세션에 섀도 연결하려면 RDS 서버의 로컬 관리자 권한이 필요했습니다. 하지만 컴퓨터나 서버의 로컬 관리자 권한을 부여하지 않고도 일반 사용자가 RDP 세션을 섀도할 수 있도록 허용할 수 있습니다.
예를 들어, AllowRDSShadow 그룹의 구성원들이 RDP 사용자 세션에 섀도 연결을 사용할 수 있도록 설정한다고 가정해 보겠습니다. 관리자 권한으로 명령 프롬프트(cmd.exe)를 열고 다음 명령을 실행합니다.
wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TSPermissionsSetting WHERE (TerminalName="RDP-Tcp") CALL AddAccount "woshub\AllowRDSShadow",2
이 명령을 실행하면 지정한 그룹에 RDP-Tcp 리스너에 대한 섀도 권한이 위임되어, 해당 그룹의 사용자들은 관리자 권한 없이도 사용자 세션에 섀도 연결을 수행할 수 있게 됩니다. 이를 통해 헬프데스크 담당자나 지원팀에게 필요한 만큼의 권한만 선택적으로 부여하는 보안 친화적인 운영이 가능합니다.