Chế độ Shadow session cho phép quản trị viên RDS xem và tương tác với desktop của người dùng. Chế độ Remote Desktop Shadowing hoạt động trên tất cả các phiên bản Windows hiện đại bắt đầu từ Windows Server 2012 R2 và Windows 8.1 (trừ Windows Server 2012, do việc chuyển stack RDP từ kernel sang user mode). Trong bài viết này, chúng ta sẽ xem xét cách cấu hình và sử dụng RDS Shadowing để kết nối và quản lý các phiên RDP người dùng đang hoạt động trên Windows Server 2016 và Windows 10.
Tùy Chọn Kết Nối Shadow Trong Windows RDP Client (mstsc.exe)
Trên Windows Server 2016/Windows 10, client RDP tích hợp (mstsc.exe) có một số tùy chọn đặc biệt có thể được sử dụng để kết nối shadow từ xa đến phiên RDP đang hoạt động của bất kỳ người dùng nào:
Mstsc.exe [/shadow:sessionID [/v:Servername] [/control] [/noConsentPrompt] [/prompt]]
- /shadow:ID – kết nối đến phiên RDP của người dùng với ID được chỉ định;
- /v:servername – bạn có thể chỉ định hostname hoặc địa chỉ IP của máy chủ RDP/RDS từ xa. Nếu không đặt, kết nối được thực hiện đến các phiên người dùng cục bộ trên máy chủ hiện tại;
- /control – cho phép tương tác với phiên người dùng (desktop). Quản trị viên có thể điều khiển chuột, nhập dữ liệu từ bàn phím của người dùng. Nếu tham số này không được đặt, chế độ xem phiên người dùng được sử dụng;
- /noConsentPrompt – tùy chọn cho phép quản trị viên buộc kết nối đến bất kỳ phiên nào mà không cần yêu cầu người dùng xác nhận kết nối;
- /prompt – cho phép kết nối với thông tin xác thực khác. Tên người dùng và mật khẩu được yêu cầu để kết nối đến máy tính từ xa.
Các phiên Shadow có thể được sử dụng để kết nối đến các phiên người dùng trên máy tính và máy chủ trong cả môi trường miền Active Directory và workgroup. Ngoài ra, không cần thiết phải có đặc quyền quản trị trên máy chủ RDS nơi phiên RDP của người dùng đang chạy. Quản trị viên có thể ủy quyền RDS Shadowing cho bất kỳ tài khoản người dùng nào, kể cả non-admin (xem thêm bên dưới).
Sử Dụng Remote Desktop Shadow Từ Giao Diện Windows GUI
Bạn có thể kết nối đến phiên người dùng bằng mstsc.exe hoặc trực tiếp từ bảng điều khiển Server Manager đồ họa. Để làm điều đó, hãy mở console Server Manager trên máy chủ RDS, đi đến phần Remote Desktop Services -> chọn bộ sưu tập của bạn, ví dụ QuickSessionCollection.
Danh sách bên phải sẽ chứa danh sách người dùng có phiên trên máy chủ RDS này. Chuột phải vào phiên người dùng bạn muốn, chọn Shadow từ menu thả xuống.
Bạn chỉ có thể kết nối đến phiên người dùng đang hoạt động. Nếu phiên ở trạng thái ngắt kết nối (do cài đặt giới hạn/timeout phiên RDS), bạn không thể kết nối đến phiên như vậy:
Shadow Error - The specified session is not connected.
Một cửa sổ với tham số kết nối Shadow sẽ xuất hiện. Bạn có thể chọn View hoặc Control phiên RDP của người dùng. Bạn cũng có thể tích chọn Prompt for user consent.
Nếu tùy chọn này được tích, yêu cầu sau sẽ xuất hiện trong phiên RDP của người dùng:
Remote Monitoring Request woshub\administrator is requesting to view your session remotely. Do you accept the request?
Nếu người dùng xác nhận kết nối, quản trị viên sẽ thấy desktop của anh ta ở chế độ View, nhưng sẽ không thể tương tác với nó.
Mẹo. Để ngắt kết nối khỏi phiên người dùng và thoát chế độ Shadow, nhấn ALT+* trên trạm làm việc hoặc Ctrl+* trên máy chủ RDS (nếu không có tổ hợp thay thế được đặt).
Nếu người dùng từ chối kết nối Shadow RDS quản trị, thông báo sau xuất hiện:
Shadow Error: The operator or administrator has refused the request.
Bạn không thể sử dụng snap-in đồ họa tsadmin.msc từ Windows Server 2008 R2 cho các kết nối shadow đến phiên RDP trên các phiên bản Windows Server mới hơn.
Nếu bạn cố gắng kết nối đến phiên của người dùng mà không yêu cầu xác nhận, bạn sẽ nhận được thông báo lỗi:
Shadow Error: The Group Policy setting is configured to require the user's consent. Verify the configuration of the policy settings.
Nếu bạn cần kiểm tra sự kiện kết nối shadow RDS cho các phiên người dùng, hãy sử dụng các sự kiện được lọc sau từ nhật ký Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational:
- Event ID 20508: Shadow View Permission Granted;
- Event ID 20503: Shadow View Session Started;
- Event ID 20504: Shadow View Session Stopped.
Cấu Hình Quy Tắc RDS Shadow Trên Windows Sử Dụng GPO
Cài đặt cho các kết nối từ xa đến phiên người dùng RDS được cấu hình bằng tham số Chính Sách Nhóm Set rules for remote control of Remote Desktop Services user sessions, nằm trong phần User và Computer của GPO: Policies -> Administrative Templates -> Windows components -> Remote Desktop Services -> Remote Session Host -> Connections. Chính sách này tương ứng với tham số DWORD Shadow dưới khóa registry HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services (giá trị của tham số này tương ứng với các thiết lập chính sách được chỉ định trong ngoặc).
Chính sách này có thể được sử dụng để cấu hình các tùy chọn kết nối Shadow RD sau:
- No remote control allowed (tương ứng với giá trị tham số registry
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).
Để đặt tham số của chính sách này trực tiếp qua registry, bạn có thể sử dụng lệnh:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v Shadow /t REG_DWORD /d 4
Sau khi thay đổi hành vi shadow phiên, hãy cập nhật cài đặt Chính Sách Nhóm trên máy chủ RDP/RDS.
Bạn có thể cấu hình quy tắc cho các kết nối shadow từ xa trong miền AD từ console gpmc.msc sử dụng tham số chính sách được mô tả ở trên, hoặc bằng cách sử dụng Group Policy Preferences, trực tiếp sửa đổi tham số registry (tùy chọn sau cho phép bạn nhắm mục tiêu chính sách chính xác hơn đến các máy tính cụ thể bằng Group Policy Item Level Targeting).
Shadowing Phiên RDP Với PowerShell
Bạn cũng có thể sử dụng tính năng Remote Desktop Services Shadow để kết nối đến phiên của người dùng từ PowerShell. Trước hết, bạn cần lấy danh sách các phiên trên máy chủ RDS (các phiên người dùng sẽ được nhóm theo trạng thái của chúng):
Get-RDUserSession | ft Username, UnifiedSessionId, SessionState, HostServer, ApplicationType -GroupBy Sessionstate
Có ba phiên RDP người dùng đang hoạt động trên máy chủ này. Hãy kết nối đến phiên người dùng với session ID 3:
Mstsc /shadow:3 /control
Ngoài ra, để lấy danh sách tất cả các phiên RDP trên máy chủ (hoặc trên desktop Windows 10 mà nhiều kết nối RDP được phép), bạn có thể sử dụng lệnh:
quser
hoặc
qwinsta
Màn hình sẽ hiển thị danh sách các phiên RDP người dùng, ID và trạng thái của chúng: Active hoặc Disconnected.
Để hiển thị danh sách các phiên trên máy chủ từ xa, hãy chạy lệnh sau:
query session /server:servername
Để kết nối đến phiên người dùng trên máy chủ từ xa, sử dụng lệnh:
mstsc /v:rdsh2:3389 /shadow:3 /control
Khoảng cổng động (RPC) 49152 đến 65535 được sử dụng để thiết lập phiên kết nối shadow từ xa thay vì cổng RDP mặc định TCP/3389.
Để kết nối shadow tiện lợi hơn đến các phiên RDP người dùng, bạn có thể sử dụng script batch sau. Nó nhắc bạn nhập tên máy chủ RDS từ xa, hiển thị danh sách tất cả các phiên và nhắc bạn chỉ định phiên (ID) mà bạn muốn kết nối:
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
Bạn có thể lưu file bat này trong thư mục %Windir%\System32. Kết quả, bạn chỉ cần chạy lệnh shadow để bắt đầu kết nối shadow.
Để kết nối đến phiên console, bạn có thể sử dụng script này:
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
Bạn cũng có thể sử dụng script PowerShell sau với GUI đơn giản (shadow_user_rdp_session.ps1) để kết nối shadow:
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()
Script này hiển thị một form đồ họa đơn giản với danh sách các phiên RDP đang hoạt động trên máy chủ cục bộ. Bạn chỉ cần chọn tài khoản người dùng và nhấn nút Connect.
Để chạy script PowerShell (*.ps1) trên máy tính, bạn cần cấu hình chính sách thực thi PowerShell (PowerShell Execution policy).
Bạn có thể sử dụng kết nối shadow người dùng không chỉ trên Windows Server với vai trò Remote Desktop Services, mà còn để kết nối đến desktop người dùng chạy Windows 10 (Sử dụng Chế Độ Shadowing Phiên Remote Desktop Trong Windows 10).
Cách Cho Phép Người Dùng Không Phải Admin Shadow Phiên RDS?
Trong các ví dụ trên, sử dụng kết nối shadow đến phiên người dùng RDS yêu cầu đặc quyền quản trị cục bộ trên máy chủ RDS. Tuy nhiên, bạn có thể cho phép người dùng không phải admin shadow phiên RDP mà không cần cấp quyền admin cục bộ trên máy tính/máy chủ.
Ví dụ, bạn muốn cho phép thành viên của nhóm AllowRDSShadow sử dụng kết nối shadow đến phiên người dùng RDP. Mở dấu nhắc lệnh nâng cao (cmd.exe) và chạy lệnh:
wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TSPermissionsSetting WHERE (TerminalName=”RDP-Tcp”) CALL AddAccount “woshub\AllowRDSShadow”,2