ค้นหาเว็บไซต์

วิธีการ Shadow (การควบคุมระยะไกล) เซสชัน RDP ของผู้ใช้บน RDS Windows Server 2016/2019


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

ตัวเลือกการเชื่อมต่อเงาในไคลเอนต์ Windows RDP (mstsc.exe)

บน Windows Server 2016/Windows 10 ไคลเอนต์ RDP ในตัว (

mstsc.exe

) มีตัวเลือกพิเศษหลายอย่างที่สามารถใช้เพื่อเชื่อมต่อเงาระยะไกลกับเซสชัน RDP ที่ใช้งานอยู่ของผู้ใช้รายใดก็ได้:

Mstsc.exe [/shadow:sessionID [/v:Servername] [/control] [/noConsentPrompt] [/prompt]]

/shadow:ID

- เชื่อมต่อกับเซสชัน RDP ของผู้ใช้ด้วย ID ที่ระบุ

/v:servername

- คุณสามารถระบุชื่อโฮสต์หรือที่อยู่ IP ของโฮสต์ RDP/RDS ระยะไกลได้ หากไม่ได้ตั้งค่า การเชื่อมต่อกับเซสชันผู้ใช้ภายในบนโฮสต์ปัจจุบัน

/control

- อนุญาตให้โต้ตอบกับเซสชันผู้ใช้ (เดสก์ท็อป) ผู้ดูแลระบบสามารถควบคุมเมาส์ของผู้ใช้ ป้อนข้อมูลจากแป้นพิมพ์ หากไม่ได้ตั้งค่าพารามิเตอร์นี้ ระบบจะใช้โหมดมุมมองเซสชันของผู้ใช้

/noConsentPrompt

- ตัวเลือกนี้ช่วยให้ผู้ดูแลระบบบังคับการเชื่อมต่อกับเซสชันใดๆ โดยไม่ต้องขอให้ผู้ใช้ยืนยันการเชื่อมต่อ

/prompt

- อนุญาตให้เชื่อมต่อกับข้อมูลประจำตัวอื่นๆ ขอชื่อผู้ใช้และรหัสผ่านเพื่อเชื่อมต่อกับคอมพิวเตอร์ระยะไกล

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

ใช้ Remote Desktop Shadow จาก Windows GUI

คุณสามารถเชื่อมต่อกับเซสชันผู้ใช้โดยใช้

mstsc.exe

หรือโดยตรงจากคอนโซลกราฟิก Server Manager โดยเปิดคอนโซลตัวจัดการเซิร์ฟเวอร์บนเซิร์ฟเวอร์ RDS ไปที่ส่วนบริการเดสก์ท็อประยะไกล -> เลือกคอลเลกชันของคุณ เช่น

QuickSessionCollection

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

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

Shadow Error - The specified session is not connected.

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

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

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

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

เคล็ดลับ หากต้องการยกเลิกการเชื่อมต่อจากเซสชันของผู้ใช้และออกจากโหมดเงา ให้กด

ALT+*

บนเวิร์กสเตชันหรือ

Ctrl+*

บนเซิร์ฟเวอร์ RDS (หากไม่ได้ตั้งค่าชุดค่าผสมอื่น)

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

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

คุณไม่สามารถใช้สแน็ปอินแบบกราฟิก tsadmin.msc จาก Windows Server 2008 R2 สำหรับการเชื่อมต่อเงากับเซสชัน 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 สำหรับเซสชันผู้ใช้ ให้ใช้เหตุการณ์ที่กรองต่อไปนี้จากบันทึก Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational:

  • รหัสเหตุการณ์ 20508: อนุญาตการดูเงา

  • รหัสเหตุการณ์ 20503: เริ่มเซสชัน Shadow View แล้ว

  • รหัสเหตุการณ์ 20504: หยุดเซสชัน Shadow View

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

การตั้งค่าสำหรับการเชื่อมต่อระยะไกลกับเซสชันผู้ใช้ RDS ได้รับการกำหนดค่าโดยใช้พารามิเตอร์นโยบายกลุ่ม ตั้งกฎสำหรับการควบคุมระยะไกลของเซสชันผู้ใช้ Remote Desktop Services ซึ่งอยู่ภายใต้ส่วนผู้ใช้และคอมพิวเตอร์ของ GPO: นโยบาย - > เทมเพลตการดูแลระบบ -> ส่วนประกอบของ Windows -> บริการเดสก์ท็อประยะไกล -> โฮสต์เซสชันระยะไกล -> การเชื่อมต่อ นโยบายนี้สอดคล้องกับพารามิเตอร์ Shadow DWORD ภายใต้คีย์รีจิสทรี

HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services

(ค่าของพารามิเตอร์นี้สอดคล้องกับการตั้งค่านโยบายระบุไว้ในวงเล็บ)

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

  • ไม่อนุญาตให้มีการควบคุมระยะไกล (สอดคล้องกับค่าของพารามิเตอร์รีจิสทรี

    Shadow = 0

    );

  • ควบคุมโดยสมบูรณ์โดยได้รับอนุญาตจากผู้ใช้ (

    1

    );

  • การควบคุมทั้งหมดโดยไม่ได้รับอนุญาตจากผู้ใช้ (

    2

    );

  • ดูเซสชันโดยได้รับอนุญาตจากผู้ใช้ (

    3

    );

  • ดูเซสชันโดยไม่ได้รับอนุญาตจากผู้ใช้ (

    4

    ).

หากต้องการตั้งค่าพารามิเตอร์ของนโยบายนี้โดยตรงผ่านรีจิสทรี คุณสามารถใช้คำสั่ง:

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

หลังจากเปลี่ยนลักษณะการทำงานของเงาของเซสชัน ให้อัปเดตการตั้งค่า Group Policy บนโฮสต์ RDP/RDS

คุณสามารถกำหนดค่ากฎสำหรับการเชื่อมต่อเงาระยะไกลในโดเมน AD จาก

gpmc.msc

คอนโซลโดยใช้พารามิเตอร์นโยบายที่อธิบายไว้ข้างต้น หรือโดยใช้การตั้งค่านโยบายกลุ่ม ซึ่งแก้ไขพารามิเตอร์รีจิสทรีโดยตรง (ตัวเลือกหลังช่วยให้คุณกำหนดเป้าหมายนโยบายไปยังคอมพิวเตอร์เฉพาะเจาะจงได้แม่นยำยิ่งขึ้นโดยใช้การกำหนดเป้าหมายระดับรายการนโยบายกลุ่ม)

การสร้างเงาเซสชัน RDP ด้วย PowerShell

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

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

มีเซสชันผู้ใช้ 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

ช่วงพอร์ตแบบไดนามิก (RPC) 49152 ถึง 65535 ใช้เพื่อสร้างเซสชันการเชื่อมต่อเงาระยะไกลแทนพอร์ต TCP/3389 RDP เริ่มต้น

สำหรับการเชื่อมต่อเงาที่สะดวกยิ่งขึ้นกับเซสชันผู้ใช้ 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

คุณสามารถบันทึกไฟล์ค้างคาวนี้ในไฟล์

%Windir%\System32

ไดเรกทอรี ด้วยเหตุนี้ คุณเพียงแค่เรียกใช้คำสั่ง shadow เพื่อเริ่มการเชื่อมต่อ 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

คุณยังสามารถใช้สคริปต์ PowerShell ต่อไปนี้กับ GUI แบบง่าย (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 ที่ใช้งานอยู่บนโลคัลโฮสต์ คุณเพียงแค่ต้องเลือกบัญชีผู้ใช้และคลิกปุ่ม เชื่อมต่อ

ในการเรียกใช้สคริปต์ PowerShell (*.ps1) บนคอมพิวเตอร์ คุณต้องกำหนดค่านโยบาย PowerShell Execution

คุณสามารถใช้การเชื่อมต่อผู้ใช้เงาได้ไม่เฉพาะบน Windows Server ที่มีบทบาท Remote Desktop Services เท่านั้น แต่ยังสามารถเชื่อมต่อได้อีกด้วย ไปยังเดสก์ท็อปของผู้ใช้ที่ใช้ Windows 10 (ใช้โหมด Shadowing ของเซสชันเดสก์ท็อประยะไกลใน Windows 10)

จะอนุญาตให้ผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบเงาเซสชัน RDS ได้อย่างไร

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

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

wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TSPermissionsSetting WHERE (TerminalName=”RDP-Tcp”) CALL AddAccount “a-d\AllowRDSShadow”,2

บทความที่เกี่ยวข้อง