Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

วิธี Shadow (Remote Control) เซสชัน RDP ของผู้ใช้บน RDS Windows Server 2016/2019

Shadow Session Mode ช่วยให้ผู้ดูแล RDS สามารถดูและโต้ตอบกับเดสก์ท็อปของผู้ใช้ได้ Remote Desktop Shadowing Mode ทำงานบน Windows เวอร์ชันสมัยใหม่ทั้งหมดตั้งแต่ Windows Server 2012 R2 และ Windows 8.1 (ยกเว้น Windows Server 2012 เนื่องจากการย้าย RDP Stack จาก Kernel ไป User Mode) ในบทความนี้ เราจะดูวิธีกำหนดค่าและใช้ RDS Shadowing เพื่อเชื่อมต่อและจัดการเซสชัน RDP ของผู้ใช้ที่ใช้งานอยู่บน Windows Server 2016 และ Windows 10

ตัวเลือกการเชื่อมต่อ Shadow ใน Windows RDP Client (mstsc.exe)

บน Windows Server 2016/Windows 10 RDP Client ที่สร้างมาอยู่ (mstsc.exe) มีตัวเลือกพิเศษหลายอย่างที่สามารถใช้เพื่อเชื่อมต่อ Shadow ไปยังเซสชัน RDP ที่ใช้งานอยู่ของผู้ใช้ได้:

Mstsc.exe [/shadow:sessionID [/v:Servername] [/control] [/noConsentPrompt] [/prompt]]
  • /shadow:ID – เชื่อมต่อกับเซสชัน RDP ของผู้ใช้ที่มี ID ที่ระบุ;
  • /v:servername – คุณสามารถระบุชื่อโฮสต์หรือที่อยู่ IP ของโฮสต์ RDP/RDS ระยะไกล หากไม่ตั้งค่า จะเชื่อมต่อกับเซสชันผู้ใช้ท้องถิ่นบนโฮสต์ปัจจุบัน;
  • /control – อนุญาตให้โต้ตอบกับเซสชันผู้ใช้ (เดสก์ท็อป) ผู้ดูแลสามารถควบคุมเมาส์ของผู้ใช้ ป้อนข้อมูลจากคีย์บอร์ด หากไม่ตั้งค่าพารามิเตอร์นี้ จะใช้โหมด View เท่านั้น;
  • /noConsentPrompt – ตัวเลือกนี้ช่วยให้ผู้ดูแลบังคับการเชื่อมต่อกับเซสชันใดๆ ได้โดยไม่ขอให้ผู้ใช้ยืนยันการเชื่อมต่อ;
  • /prompt – อนุญาตให้เชื่อมต่อด้วยข้อมูลประจำตัวอื่น ระบบจะขอชื่อผู้ใช้และรหัสผ่านเพื่อเชื่อมต่อกับคอมพิวเตอร์ระยะไกล

เซสชัน Shadow สามารถใช้เชื่อมต่อกับเซสชันผู้ใช้บนคอมพิวเตอร์และเซิร์ฟเวอร์ทั้งในโดเมน Active Directory และ Workgroup นอกจากนี้ ไม่จำเป็นต้องมีสิทธิ์ผู้ดูแลระบบบนโฮสต์ RDS ที่เซสชัน RDP ของผู้ใช้กำลังทำงานอยู่ ผู้ดูแลสามารถมอบสิทธิ์ RDS Shadowing ให้กับบัญชีผู้ใช้ใดๆ ได้ แม้แต่ Non-Admin (รายละเอียดเพิ่มเติมด้านล่าง)

การใช้ Remote Desktop Shadow จาก Windows GUI

คุณสามารถเชื่อมต่อกับเซสชันผู้ใช้โดยใช้ mstsc.exe หรือโดยตรงจากคอนโซลกราฟิก Server Manager ในการทำเช่นนี้ ให้เปิดคอนโซล Server Manager บนเซิร์ฟเวอร์ RDS ไปที่ส่วน Remote Desktop Services -> เลือก Collection ของคุณ เช่น QuickSessionCollection

รายการทางขวาจะมีรายชื่อผู้ใช้ที่มีเซสชันบนเซิร์ฟเวอร์ RDS นี้ คลิกขวาที่เซสชันผู้ใช้ที่คุณต้องการ เลือก Shadow จากเมนูแบบดรอปดาวน์

คุณสามารถเชื่อมต่อกับเซสชันผู้ใช้ที่ใช้งานอยู่ (Active) เท่านั้น หากเซสชันอยู่ในสถานะ Disconnected (เนื่องจากการตั้งค่าขีดจำกัด/หมดเวลาเซสชัน RDS) คุณจะไม่สามารถเชื่อมต่อกับเซสชันนั้นได้:

Shadow Error - The specified session is not connected.

จะปรากฏหน้าต่างพร้อมพารามิเตอร์การเชื่อมต่อ Shadow คุณสามารถ View หรือ Control เซสชัน RDP ของผู้ใช้ คุณยังสามารถติ๊กเลือก Prompt for user consent ได้

หากตัวเลือกนี้ถูกติ๊ก คำขอต่อไปนี้จะปรากฏในเซสชัน RDP ของผู้ใช้:

Remote Monitoring Request woshub\administrator is requesting to view your session remotely. Do you accept the request?

หากผู้ใช้ยืนยันการเชื่อมต่อ ผู้ดูแลจะเห็นเดสก์ท็อปของเขาในโหมด View แต่จะไม่สามารถโต้ตอบกับมันได้

💡 เคล็ดลับ: เพื่อตัดการเชื่อมต่อจากเซสชันผู้ใช้และออกจากโหมด Shadow ให้กด ALT+* บนเวิร์กสเตชัน หรือ Ctrl+* บนเซิร์ฟเวอร์ RDS (หากไม่ได้ตั้งค่าการผสมผสานทางเลือกอื่น)

หากผู้ใช้ปฏิเสธการเชื่อมต่อ Shadow RDS ของผู้ดูแล จะปรากฏข้อความ:

Shadow Error: The operator or administrator has refused the request.

คุณไม่สามารถใช้ Snap-in แบบกราฟิก tsadmin.msc จาก Windows Server 2008 R2 สำหรับการเชื่อมต่อ Shadow ไปยังเซสชัน RDP บน Windows Server เวอร์ชันใหม่กว่าได้

หากคุณพยายามเชื่อมต่อกับเซสชันของผู้ใช้โดยไม่ขอการยืนยัน คุณจะได้รับข้อความข้อผิดพลาด:

Shadow Error: The Group Policy setting is configured to require the user's consent. Verify the configuration of the policy settings.

การตรวจสอบเหตุการณ์ RDS Shadow Connection

หากคุณต้องการตรวจสอบเหตุการณ์การเชื่อมต่อ RDS Shadow สำหรับเซสชันผู้ใช้ ให้ใช้เหตุการณ์ที่กรองแล้วจากล็อก 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.

การกำหนดค่ากฎ RDS Shadow บน Windows โดยใช้ GPO

การตั้งค่าสำหรับการเชื่อมต่อระยะไกลไปยังเซสชันผู้ใช้ RDS ถูกกำหนดค่าโดยพารามิเตอร์ Group Policy Set rules for remote control of Remote Desktop Services user sessions ซึ่งอยู่ภายใต้ส่วน User และ Computer ของ GPO: Policies -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Session Host -> Connections นโยบายนี้สอดคล้องกับพารามิเตอร์ DWORD Shadow ภายใต้คีย์รีจิสทรี HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services (ค่าของพารามิเตอร์นี้ที่สอดคล้องกับการตั้งค่านโยบายระบุในวงเล็บ)

นโยบายนี้สามารถใช้กำหนดค่าตัวเลือกการเชื่อมต่อ RD Shadow ต่อไปนี้ได้:

  • No remote control allowed (สอดคล้องกับค่าพารามิเตอร์รีจิสทรี 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).

เพื่อตั้งค่าพารามิเตอร์ของนโยบายนี้โดยตรงผ่าน Registry สามารถใช้คำสั่ง:

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v Shadow /t REG_DWORD /d 4

หลังจากเปลี่ยนพฤติกรรม Shadow Session ให้อัปเดตการตั้งค่า Group Policy บนโฮสต์ RDP/RDS

คุณสามารถกำหนดกฎสำหรับการเชื่อมต่อ Shadow ระยะไกลในโดเมน AD จากคอนโซล gpmc.msc โดยใช้พารามิเตอร์นโยบายที่อธิบายไว้ข้างต้น หรือโดยใช้ Group Policy Preferences ซึ่งแก้ไขพารามิเตอร์รีจิสทรีโดยตรง (ตัวเลือกที่สองช่วยให้คุณกำหนดเป้าหมายนโยบายไปยังคอมพิวเตอร์เฉพาะเจาะจงได้อย่างแม่นยำมากขึ้นโดยใช้ Group Policy Item Level Targeting)

Shadowing RDP Session ด้วย PowerShell

คุณยังสามารถใช้คุณสมบัติ Remote Desktop Services Shadow เพื่อเชื่อมต่อกับเซสชันของผู้ใช้จาก PowerShell ก่อนอื่น คุณต้องดึงรายการเซสชันบนโฮสต์ RDS (เซสชันผู้ใช้จะถูกจัดกลุ่มตามสถานะของพวกเขา):

Get-RDUserSession | ft Username, UnifiedSessionId, SessionState, HostServer, ApplicationType -GroupBy SessionState

มีเซสชัน RDP ผู้ใช้ที่ใช้งานอยู่ 3 เซสชันบนเซิร์ฟเวอร์นี้ ลองเชื่อมต่อกับเซสชันผู้ใช้ที่มี Session 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
💡 หมายเหตุ: ช่วงพอร์ตไดนามิก (RPC) 49152 ถึง 65535 ถูกใช้เพื่อสร้างเซสชันการเชื่อมต่อ Shadow ระยะไกลแทนพอร์ต RDP เริ่มต้น TCP/3389

สคริปต์สำหรับ Shadow Connection ที่สะดวก

สำหรับการเชื่อมต่อ Shadow ไปยังเซสชัน RDP ผู้ใช้ที่สะดวกขึ้น คุณสามารถใช้ Batch Script ต่อไปนี้ ซึ่งจะพรอมต์ให้ป้อนชื่อเซิร์ฟเวอร์ RDS ระยะไกล แสดงรายการเซสชันทั้งหมด และพรอมต์ให้ระบุเซสชัน (ID) ที่คุณต้องการเชื่อมต่อ:

@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 Session คุณสามารถใช้สคริปต์นี้:

@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

คุณยังสามารถใช้สคริปต์ PowerShell ต่อไปนี้พร้อม GUI เรียบง่าย (shadow_user_rdp_session.ps1) สำหรับ Shadow Connection:

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)
 }
}
)
$gForm.ShowDialog()

สคริปต์นี้แสดงฟอร์มกราฟิกง่ายๆ พร้อมรายการเซสชัน RDP ที่ใช้งานอยู่บนโฮสต์ท้องถิ่น คุณเพียงต้องเลือกบัญชีผู้ใช้และคลิกปุ่ม Connect

⚠ หมายเหตุ: เพื่อรันสคริปต์ PowerShell (*.ps1) บนคอมพิวเตอร์ คุณต้องกำหนดค่า PowerShell Execution Policy

คุณสามารถใช้การเชื่อมต่อ Shadow User ไม่ได้แค่บน Windows Server ที่มีบทบาท Remote Desktop Services แต่ยังสามารถเชื่อมต่อกับเดสก์ท็อปของผู้ใช้ที่รัน Windows 10 ได้ (Using Remote Desktop Session Shadowing Mode in Windows 10)

วิธีอนุญาตให้ Non-Admin Users Shadow RDS Sessions

ในตัวอย่างข้างต้น การใช้ Shadow Connection ไปยังเซสชันผู้ใช้ RDS ต้องการสิทธิ์ผู้ดูแลระบบท้องถิ่นบนเซิร์ฟเวอร์ RDS อย่างไรก็ตาม คุณสามารถอนุญาตให้ผู้ใช้ที่ไม่ใช่แอดมิน Shadow เซสชัน RDP ได้โดยไม่ให้สิทธิ์แอดมินท้องถิ่นบนคอมพิวเตอร์/เซิร์ฟเวอร์

ตัวอย่างเช่น คุณต้องการอนุญาตให้สมาชิกของกลุ่ม AllowRDSShadow ใช้การเชื่อมต่อ Shadow ไปยังเซสชันผู้ใช้ RDP เปิด Command Prompt ด้วยสิทธิ์แอดมิน (cmd.exe) และรันคำสั่ง:

wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TSPermissionsSetting WHERE (TerminalName="RDP-Tcp") CALL AddAccount "woshub\AllowRDSShadow",2