ผู้ใช้ระยะไกลสามารถเชื่อมต่อกับคอมพิวเตอร์ Windows 10 และ 11 ผ่านบริการเดสก์ท็อประยะไกล (RDP) การเปิดใช้งาน RDP ในการตั้งค่าอุปกรณ์และเชื่อมต่อกับคอมพิวเตอร์โดยใช้ไคลเอ็นต์เดสก์ท็อประยะไกลก็เพียงพอแล้ว แต่มีข้อ จำกัด เกี่ยวกับจำนวนเซสชัน RDP พร้อมกัน – ผู้ใช้ระยะไกลเพียงคนเดียวเท่านั้นที่สามารถทำงานได้พร้อมกัน หากคุณพยายามเปิดเซสชัน RDP ที่สอง คำเตือนจะปรากฏขึ้นเพื่อขอให้คุณยกเลิกการเชื่อมต่อเซสชันของผู้ใช้คนแรก
Another user is signed in. If you continue, they’ll be disconnected. Do you want to sign in anyway?
เวอร์ชันเดสก์ท็อป Windows ทั้งหมด (รวมถึง Win 10 และ 11) มีข้อจำกัดหลายประการเกี่ยวกับการใช้บริการเดสก์ท็อประยะไกล:
- คุณสามารถเชื่อมต่อจากระยะไกลผ่าน RDP ได้เฉพาะกับ Windows รุ่นที่สูงขึ้น (Professional และ Enterprise) ในรุ่น Windows Home และ Single Language การเชื่อมต่อเดสก์ท็อประยะไกลขาเข้าเป็นสิ่งต้องห้าม
- รองรับการเชื่อมต่อ RDP พร้อมกันเพียงครั้งเดียวเท่านั้น เมื่อคุณพยายามเปิดเซสชัน RDP ที่สอง ผู้ใช้จะได้รับแจ้งให้ปิดการเชื่อมต่อที่ใช้งานอยู่
- หากมีผู้ใช้ที่ทำงานบนคอนโซลของคอมพิวเตอร์ (ในเครื่อง) ดังนั้นเมื่อคุณพยายามสร้างการเชื่อมต่อ RDP ระยะไกลใหม่ เซสชันคอนโซลจะถูกตัดการเชื่อมต่อ เซสชัน RDP ระยะไกลจะถูกบังคับให้ยกเลิกการเชื่อมต่อหากผู้ใช้พยายามเข้าสู่ระบบภายในเครื่อง
อันที่จริง จำนวนการเชื่อมต่อ RDP พร้อมกันบน Windows นั้นถูกจำกัดโดยใบอนุญาต (และไม่ใช่โดยด้านเทคนิคใดๆ) ดังนั้น ข้อจำกัดนี้จึงไม่อนุญาตให้สร้างเซิร์ฟเวอร์ Terminal RDP ตามเวิร์กสเตชันที่ผู้ใช้หลายคนใช้ได้ ตรรกะของ Microsoft นั้นง่ายมาก หากคุณต้องการเทอร์มินัลเซิร์ฟเวอร์ ซื้อลิขสิทธิ์ Windows Server, RDS CAL ติดตั้งและกำหนดค่าบทบาทโฮสต์เซสชันเดสก์ท็อประยะไกล (RDSH)
ในทางเทคนิคแล้ว Windows ทุกรุ่นที่มี RAM เพียงพอสามารถรองรับการทำงานพร้อมกันของผู้ใช้ระยะไกลได้หลายสิบคน โดยเฉลี่ยแล้ว ผู้ใช้หนึ่งเซสชันต้องการ RAM 150-200 MB (ไม่รวมแอปที่รันอยู่) กล่าวคือ จำนวนสูงสุดของเซสชัน RDP พร้อมกันนั้นจำกัดในทางทฤษฎีโดยทรัพยากรคอมพิวเตอร์เท่านั้น
ลองพิจารณาสองวิธีในการอนุญาตการเชื่อมต่อ RDP พร้อมกันบน Windows 10 และ 11:การใช้ RDP Wrapper เครื่องมือหรือแก้ไข termsrv.dll ไฟล์ระบบ
หมายเหตุ . การแก้ไขระบบที่อธิบายไว้ในบทความถือเป็นการละเมิดข้อตกลงสิทธิ์การใช้งานของ Microsoft และคุณอาจดำเนินการตามความเสี่ยงของคุณเอง
RDP Wrapper:เปิดใช้งานเซสชัน RDP หลายรายการใน Windows
ไลบรารี RDP Wrapper โปรเจ็กต์ OpenSource ให้คุณเปิดใช้งาน RDP หลายเซสชันใน Windows 10 โดยไม่ต้องเปลี่ยนไฟล์ Termsrv.dll เครื่องมือนี้ทำงานเป็นเลเยอร์ระหว่าง SCM (Service Control Manager) และบริการเดสก์ท็อประยะไกล RDPWrap ช่วยให้คุณเปิดใช้งานไม่เพียงแต่รองรับการเชื่อมต่อ RDP หลายรายการพร้อมกัน แต่ยังสร้างเซิร์ฟเวอร์ RDP บน Windows Home รุ่นต่างๆ RDP Wrapper ไม่ได้ทำการเปลี่ยนแปลงใดๆ กับไฟล์ Termsrv.dll เพียงโหลดไลบรารี Termsrv ด้วยพารามิเตอร์ที่เปลี่ยนแปลง
ดังนั้น RDPWrap จะทำงานแม้ในกรณีที่มีการอัปเดตไฟล์ Termsrv.dll ช่วยให้คุณไม่ต้องกลัวการอัปเดตของ Windows
สำคัญ . ก่อนทำการติดตั้ง RDP Wrapper คุณควรกำหนดให้คุณใช้ไฟล์ Termsrv.dll เวอร์ชันดั้งเดิม (ที่ไม่ได้แพตช์) มิฉะนั้น RDP Wrapper อาจไม่เสถียรหรือไม่เริ่มทำงานเลยคุณสามารถดาวน์โหลด RDP Wrapper ได้จากที่เก็บ GitHub https://github.com/binarymaster/rdpwrap/releases (เวอร์ชันล่าสุดของ RDP Wrapper Library คือ v1.6.2) โปรเจ็กต์ไม่ได้รับการอัปเดตตั้งแต่ปี 2017 แต่สามารถใช้ได้กับ Windows 10 รุ่นใหม่และแม้แต่ Windows 11
RDPWrap-v1.6.2.zip ไฟล์เก็บถาวรมีบางไฟล์:
- RDPWinst.exe — RDP Wrapper Library ติดตั้ง/ถอนการติดตั้งโปรแกรม
- RDPConf.exe — เครื่องมือกำหนดค่า RDP Wrapper
- RDPCheck.exe —ยูทิลิตี้ตรวจสอบ RDP (ตัวตรวจสอบ RDP ในพื้นที่);
- install.bat, uninstall.bat, update.bat — แบตช์ไฟล์เพื่อติดตั้ง ถอนการติดตั้ง และอัปเดต RDP Wrapper
ในการติดตั้ง RDPWrap ให้เรียกใช้ install.bat ไฟล์ในฐานะผู้ดูแลระบบ โปรแกรมจะถูกติดตั้งลงใน C:\Program Files\RDP Wrapper ไดเร็กทอรี.
หลังจากการติดตั้งเสร็จสมบูรณ์ ให้เรียกใช้ RDPConfig.exe . เป็นไปได้มากว่าทันทีหลังการติดตั้ง เครื่องมือจะแสดงว่า wrapper RDP กำลังทำงาน (ติดตั้ง, กำลังทำงาน, กำลังฟัง) แต่ไม่ทำงาน สังเกตคำเตือนสีแดง [ไม่รองรับ] มีรายงานว่า RDPWrapper ไม่รองรับ Windows 10 เวอร์ชันนี้ (เวอร์ชัน 10.0.19041.1320)
ความจริงก็คือสำหรับ Windows 10 แต่ละเวอร์ชันนั้น จะต้องมีคำอธิบายในไฟล์คอนฟิกูเรชัน rdpwrap.ini ไฟล์ปรับแต่งของคุณไม่มีการตั้งค่าใดๆ สำหรับบิลด์ Windows 10
เวอร์ชันปัจจุบันของไฟล์ rdpwrap.ini สามารถดาวน์โหลดได้ที่นี่ https://raw.githubusercontent.com/sebaxakerhtc/rdpwrap.ini/master/rdpwrap.ini
คัดลอกเนื้อหาของเพจนี้ด้วยตนเองไปยังไฟล์ “C:\Program Files\RDP Wrapper\rdpwrap.ini” หรือดาวน์โหลดไฟล์โดยใช้ PowerShell cmdlet Invoke-WebRequest (คุณต้องหยุดบริการ Remote Desktop ก่อน):
Stop-Service termservice -Force
Invoke-WebRequest https://raw.githubusercontent.com/sebaxakerhtc/rdpwrap.ini/master/rdpwrap.ini -outfile "C:\Program Files\RDP Wrapper\rdpwrap.ini"
รีสตาร์ทเครื่องคอมพิวเตอร์ เรียกใช้เครื่องมือ RDPConfig.exe ตรวจสอบว่ารายการทั้งหมดเป็นสีเขียวใน การวินิจฉัย ส่วนและคำอธิบายภาพ [รองรับอย่างเต็มที่] จะปรากฏขึ้น ภาพหน้าจอด้านล่างแสดงให้เห็นว่า RDP Wrapper ที่มีการกำหนดค่าใหม่นี้ทำงานได้ดีบน Windows 11 เช่นกัน
พยายามสร้างเซสชัน RDP หลายเซสชันในคอมพิวเตอร์ของคุณ (ใช้ไคลเอ็นต์ RDP ใดๆ:mstsc.exe, rdcman เป็นต้น) มันใช้งานได้ดี (คุณยังสามารถใช้ข้อมูลรับรอง RDP ที่บันทึกไว้ได้)! ตอนนี้ Windows 10 ของคุณอนุญาตให้ผู้ใช้ระยะไกลสองคน (หรือมากกว่า) ใช้เซสชัน RDP ที่แตกต่างกันได้พร้อมกัน
เครื่องมือ RDPWrap รองรับใน Windows ทุกรุ่น คุณจึงสร้างเซิร์ฟเวอร์เทอร์มินัล (RDS) ของคุณเองบนอุปกรณ์ Windows ได้
นอกจากนี้ RDP Wrapper ยังช่วยให้:
- เปิดใช้งานเดสก์ท็อประยะไกล
- ตัวเลือก ซ่อนผู้ใช้บนหน้าจอเข้าสู่ระบบ ให้คุณซ่อนรายชื่อผู้ใช้จากหน้าจอเข้าสู่ระบบ Windows ได้
- หากคุณปิดใช้งาน เซสชันเดียวต่อผู้ใช้ ตัวเลือก หลายเซสชัน RDP พร้อมกันจะได้รับอนุญาตภายใต้บัญชีผู้ใช้เดียวกัน (พารามิเตอร์รีจิสทรี fSingleSessionPerUser = 0 ถูกตั้งค่าภายใต้คีย์ reg
HKLM\SYSTEM\ CurrentControlSet\Control\Terminal Server\fSingleSessionPerUser
); - พอร์ต RDP — คุณสามารถเปลี่ยนหมายเลขพอร์ตเดสก์ท็อประยะไกลจาก TCP 3389 เป็นหมายเลขอื่นได้
- ใน โหมดแชโดว์เซสชัน คุณสามารถกำหนดค่าโหมดการเชื่อมต่อของรีโมทคอนโทรล (เงา) เป็นเซสชัน RDP ได้
RDP Wrapper ไม่ทำงานบน Windows 10
ในบางกรณี เครื่องมือ RDP Wrapper ไม่ทำงานตามที่คาดไว้ และคุณไม่สามารถไปยังโฮสต์ Windows ของคุณโดยใช้เซสชัน RDP หลายเซสชันได้
หากยูทิลิตี้แสดง [ไม่รองรับ] ในส่วนสถานะ แสดงว่าไฟล์ rdpwrap.ini ไม่มีการกำหนดค่าสำหรับบิลด์ Windows ของคุณ อัปเดตไฟล์ rdpwrap.ini ตามที่อธิบายไว้ข้างต้น
หาก RDP Wrapper ไม่ทำงานหลังจากอัปเดตไฟล์ rdpwrap.ini ให้ลองเปิดไฟล์ rdpwrap.ini และมองหาส่วนคำอธิบายสำหรับเวอร์ชัน Windows ของคุณ จะทราบได้อย่างไรว่ามีการรองรับ Windows รุ่นของคุณในไฟล์กำหนดค่า rdpwrapper หรือไม่
ภาพหน้าจอด้านล่างแสดงให้เห็นว่าสำหรับ Windows 10 เวอร์ชันของฉัน (10.0.19041.1320) มีส่วนคำอธิบายสองส่วน:
[10.0.19041.1320] ….. [10.0.19041.1320-SLInit] …..
หากไม่มีส่วนใดในไฟล์กำหนดค่าสำหรับ Windows รุ่นของคุณ ลองใช้ Google เพื่อค้นหาสตริง rdpwrap.ini สำหรับ Windows ของคุณ เพิ่มบรรทัดที่คุณพบที่ส่วนท้ายของไฟล์
นอกจากนี้ หากคุณมีปัญหากับ RDPWrapper คุณสามารถเปิดปัญหาได้ที่ https://github.com/stascorp/rdpwrap/issues คุณยังสามารถค้นหาไฟล์ rdpwrap.ini จริงได้ที่นี่หากหลังจากติดตั้งการอัปเดตความปลอดภัยหรืออัปเกรดบิลด์ Windows 10 แล้ว RDP Wrapper ทำงานไม่ถูกต้อง ให้ตรวจสอบว่า "สถานะผู้ฟัง:ไม่รับฟัง" แสดงอยู่ในส่วนการวินิจฉัย
ลองอัปเดตไฟล์ rdpwrap.ini แล้วติดตั้งบริการใหม่:
rdpwinst.exe -u
rdpwinst.exe -i
เกิดขึ้นว่าเมื่อคุณพยายามสร้างการเชื่อมต่อ RDP ที่สองภายใต้บัญชีผู้ใช้อื่น คุณจะเห็นคำเตือน:
The number of connections to this computer is limited and all connections are in use right now. Try connecting later or contact your system administrator.
ในกรณีนี้ คุณสามารถใช้ Local Group Policy Editor (gpedit.msc) เพื่อเปิดใช้งานนโยบาย “จำกัดจำนวนการเชื่อมต่อ ” ภายใต้การกำหนดค่าคอมพิวเตอร์ -> เทมเพลตการดูแล -> ส่วนประกอบ Windows -> บริการเดสก์ท็อประยะไกล -> โฮสต์เซสชันเดสก์ท็อประยะไกล -> ส่วนการเชื่อมต่อ เปลี่ยนค่าเป็น 999999
รีสตาร์ทคอมพิวเตอร์เพื่ออัปเดต GPO และใช้การตั้งค่า
แก้ไข Termsrv.dll เพื่อเปิดใช้งานเซสชัน RDP หลายรายการ
หากต้องการลบข้อจำกัดเกี่ยวกับจำนวนการเชื่อมต่อผู้ใช้ RDP พร้อมกันใน Windows 10 โดยไม่ต้องใช้ rdpwrapper คุณสามารถแทนที่ termsrv.dll ดั้งเดิม ไฟล์. นี่คือไฟล์ไลบรารีหลักที่ใช้โดยบริการเดสก์ท็อประยะไกล ไฟล์นี้อยู่ใน C:\Windows\System32 ไดเรกทอรี
ก่อนที่คุณจะแก้ไขหรือแทนที่ไฟล์ Termsrv.dll ขอแนะนำให้สร้างสำเนาสำรอง วิธีนี้จะช่วยให้คุณเปลี่ยนกลับเป็นไฟล์เวอร์ชันดั้งเดิมได้หากจำเป็น เปิดพรอมต์คำสั่งที่ยกระดับแล้วเรียกใช้คำสั่ง:
copy c:\Windows\System32\termsrv.dll termsrv.dll_backup
จากนั้นคุณต้องเป็นเจ้าของไฟล์ วิธีเปลี่ยนเจ้าของไฟล์จาก TrustedInstaller เป็นกลุ่มผู้ดูแลระบบภายในโดยใช้คำสั่ง:
takeown /F c:\Windows\System32\termsrv.dll /A
SUCCESS: The file (or folder): c:\Windows\System32\termsrv.dll now owned by the administrators group
ตอนนี้ให้สิทธิ์การควบคุมแบบเต็มของกลุ่มผู้ดูแลระบบในพื้นที่ในไฟล์ Termsrv.dll โดยใช้ icacls.exe:
icacls c:\Windows\System32\termsrv.dll /grant Administrators:F
processed file: c:\Windows\System32\termsrv.dll Successfully processed 1 files; Failed processing 0 files.
หลังจากนั้น ให้หยุดบริการเดสก์ท็อประยะไกล (TermService ) โดยใช้ services.msc คอนโซลหรือจากพรอมต์คำสั่ง:
Net stop TermService
บริการ Remote Desktop Services UserMode Port Redirector จะหยุดให้บริการ
ก่อนดำเนินการต่อ คุณต้องค้นหาเวอร์ชันของคุณ (หมายเลขบิลด์) ของ Windows 10 เปิดคอนโซล PowerShell และเรียกใช้คำสั่ง:
Get-ComputerInfo | select WindowsProductName, WindowsVersion
จากนั้นเปิดไฟล์ Termsrv.dll โดยใช้โปรแกรมแก้ไข HEX (เช่น Tiny Hexer) คุณต้องค้นหาและแทนที่สตริงตามตารางด้านล่าง ทั้งนี้ขึ้นอยู่กับรุ่น Windows ของคุณ:
บิลด์ของ Windows | ค้นหาสตริง | แทนที่ด้วย |
Windows 11 RTM ( 21H2 – 22000.258) | 39 81 3C 06 00 00 0F 84 4F 68 01 00 |
B8 00 01 00 00 89 81 38 06 00 00 90
|
Windows 10 x64 21H2 | 39 81 3C 06 00 00 0F 84 DB 61 01 00 | |
Windows 10 x64 21H1 | 39 81 3C 06 00 00 0F 84 2B 5F 01 00 | |
Windows 10 x64 20H2 | 39 81 3C 06 00 00 0F 84 21 68 01 00 | |
Windows 10 x64 2004 | 39 81 3C 06 00 00 0F 84 D9 51 01 00 | |
Windows 10 x64 1909 | 39 81 3C 06 00 00 0F 84 5D 61 01 00 | |
Windows 10 x64 1903 | 39 81 3C 06 00 00 0F 84 5D 61 01 00 | |
Windows 10 x64 1809 | 39 81 3C 06 00 00 0F 84 3B 2B 01 00
| |
Windows 10 x64 1803 | 8B 99 3C 06 00 00 8B B9 38 06 00 00
| |
Windows 10 x64 1709 | 39 81 3C 06 00 00 0F 84 B1 7D 02 00
|
ตัวอย่างเช่น บิวด์ของ Windows 10 x64 ของฉันคือ 21H1 (19043.1320) ที่มีไฟล์ Termsrv.dll เวอร์ชัน 10.0.19041.1320 เปิดไฟล์ Termsrv.dll ใน Tiny Hexer จากนั้นค้นหาข้อความ:
39 81 3C 06 00 00 0F 84 2B 5F 01 00
และแทนที่ด้วย:
B8 00 01 00 00 89 81 38 06 00 00 90
บันทึกไฟล์และเรียกใช้ TermService
หากมีข้อผิดพลาดและคุณประสบปัญหาบางอย่างกับบริการเดสก์ท็อประยะไกล ให้หยุดบริการและแทนที่ไฟล์ Termsrv.dll ที่แก้ไขด้วยเวอร์ชันดั้งเดิม:
copy termsrv.dll_backup c:\Windows\System32\termsrv.dll
กำลังแก้ไข Termsrv.dll บน Windows โดยใช้ PowerShell
เพื่อไม่ให้แก้ไขไฟล์ Termsrv.dll ด้วยตนเองโดยใช้โปรแกรมแก้ไข HEX คุณสามารถใช้สคริปต์ PowerShell ต่อไปนี้เพื่อใช้โปรแกรมแก้ไขโดยอัตโนมัติ สคริปต์นี้ใช้เวอร์ชัน Windows PowerShell และไม่สามารถใช้ได้กับ PowerShell Core ที่ทันสมัย สคริปต์นี้เป็นสคริปต์สากลและสามารถใช้เพื่อแก้ไขไฟล์ Termsrv.dll ใน Windows 10 (1809+) และ Windows 11 ทุกรุ่น
# Stop RDP service, make a backup of the termsrv.dllfile and change the permissions
Stop-Service UmRdpService -Force
Stop-Service TermService -Force
$termsrv_dll_acl = Get-Acl c:\windows\system32\termsrv.dll
Copy-Item c:\windows\system32\termsrv.dll c:\windows\system32\termsrv.dll.copy
takeown /f c:\windows\system32\termsrv.dll
$new_termsrv_dll_owner = (Get-Acl c:\windows\system32\termsrv.dll).owner
cmd /c "icacls c:\windows\system32\termsrv.dll /Grant $($new_termsrv_dll_owner):F /C"
# search for a pattern in termsrv.dll file
$dll_as_bytes = Get-Content c:\windows\system32\termsrv.dll -Raw -Encoding byte
$dll_as_text = $dll_as_bytes.forEach('ToString', 'X2') -join ' '
$patternregex = ([regex]'39 81 3C 06 00 00(\s\S\S){6}')
$patch = 'B8 00 01 00 00 89 81 38 06 00 00 90'
$checkPattern=Select-String -Pattern $patternregex -InputObject $dll_as_text
If ($checkPattern -ne $null) {
$dll_as_text_replaced = $dll_as_text -replace $patternregex, $patch
}
Elseif (Select-String -Pattern $patch -InputObject $dll_as_text) {
Write-Output 'The termsrv.dll file is already patch, exitting'
Exit
}
else {
Write-Output "Pattern not found "
}
# patching termsrv.dll
[byte[]] $dll_as_bytes_replaced = -split $dll_as_text_replaced -replace '^', '0x'
Set-Content c:\windows\system32\termsrv.dll.patched -Encoding Byte -Value $dll_as_bytes_replaced
# comparing two files
fc.exe /b c:\windows\system32\termsrv.dll.patched c:\windows\system32\termsrv.dll
# replacing the original termsrv.dll file
Copy-Item c:\windows\system32\termsrv.dll.patched c:\windows\system32\termsrv.dll -Force
Set-Acl c:\windows\system32\termsrv.dll $termsrv_dll_acl
Start-Service UmRdpService
Start-Service TermService
รหัสสคริปต์ที่สมบูรณ์มีอยู่ในที่เก็บ GitHub ของฉันที่ https://github.com/maxbakhub/winposh/blob/main/termsrv_rdp_patch.ps1
ในการรันสคริปต์ ให้ดาวน์โหลดลงในคอมพิวเตอร์ของคุณ เปลี่ยนการตั้งค่านโยบายการดำเนินการของ PowerShell สำหรับเซสชันปัจจุบัน:
Set-ExecutionPolicy Bypass -Scope Process -Force
และเรียกใช้สคริปต์:
C:\users\root\desktop\termsrv_rdp_patch.ps1
สามารถเรียกใช้สคริปต์ได้หลังจากติดตั้งการอัปเดต Windows เพื่อทำการเปลี่ยนแปลงไฟล์ Termsrv.dll ทันที (คุณไม่จำเป็นต้องแก้ไขไฟล์ Termsrv.dll ในตัวแก้ไข HEX หลังจากติดตั้งการอัปเดตแต่ละครั้ง)
ข้อดีของวิธีการเปิดใช้งาน RDP หลายเซสชันใน Windows 10 หรือ 11 โดยแทนที่ไฟล์ Termsrv.dll คือโปรแกรมป้องกันไวรัสไม่ตอบสนอง (ต่างจาก RDPWrap ซึ่งโปรแกรมป้องกันไวรัสหลายตัวตรวจพบว่าเป็น Malware/HackTool/Trojan)
ข้อเสียเปรียบหลักคือ คุณจะต้องแก้ไขไฟล์ Termsrv.dll ด้วยตนเองทุกครั้งที่อัปเกรด Windows 10 build (หรือเมื่ออัปเดตเวอร์ชันของไฟล์ Termsrv.dll ระหว่างการติดตั้งการอัปเดตแบบสะสมรายเดือน) และหากคุณใช้ RDPWrapper คุณจะต้องอัปเดตไฟล์ rdpwrap.ini หลังจากติดตั้งการอัปเดตของ Windows
ในบทความนี้ เรามาดูวิธีลบข้อจำกัดเกี่ยวกับจำนวนการเชื่อมต่อผู้ใช้ RDP พร้อมกันและเรียกใช้เทอร์มินัลเซิร์ฟเวอร์ฟรีบน Windows เวอร์ชันเดสก์ท็อป