เปิดใช้งาน Remote Desktop ในไฟร์วอลล์ Windows จากบรรทัดคำสั่ง


12

หมายเหตุ: # แท็กบรรทัดคำสั่งไม่ได้หมายความถึงแบทช์ไฟล์เท่านั้นฉันจะยอมรับสคริปต์ PowerShell หรือยูทิลิตีที่มีให้ใช้งานได้ฟรีซึ่งสามารถเริ่มจากบรรทัดคำสั่งและทำงานให้เสร็จโดยไม่ต้องใส่ข้อมูล


TL; DR

วิธีแปลงกฎไฟร์วอลล์โดยไม่ตั้งใจให้ตรงกับสถานะของ GUI ใน Windows Vista ไปเป็น Windows 10 ของส่วนต่อประสาน (แสดง) ภาษาได้อย่างไร

ได้ชี้แจงรายละเอียด

คำถามนี้คล้ายกับ# 786383แต่ไม่เหมือนกัน

โดยพื้นฐานแล้วเพราะคำตอบไม่ดีสำหรับฉัน:

  1. set rule group="remote desktop" new enable=Yesเปิดพอร์ต 3389 สำหรับเครือข่ายสาธารณะและฉันต้องการหลีกเลี่ยง นอกจากนี้ภาษาต่าง ๆ ของ Windows มีชื่อกลุ่มต่างกัน แต่ฉันต้องการโซลูชันที่เป็นสากล
  2. netsh firewall set service type = remotedesktop mode = enable ไม่ทำงานสำหรับฉันเช่นกัน: มันเลิกใช้แล้วตั้งแต่ win7 และอนุญาตให้ rdp สำหรับเครือข่ายปัจจุบันเท่านั้น (หากคุณอยู่ในที่สาธารณะ 3389 จะถูกเปิดสำหรับเครือข่ายสาธารณะและจะไม่ทำงานในเครือข่ายส่วนตัวในภายหลัง)

โปรดทราบว่าก่อนที่จะเปิดใช้งาน RDP ผ่าน GUI จะมีเพียงหนึ่งกฎต่อโปรโตคอลสำหรับ RDP แต่เมื่อเปิดใช้งาน RDP ผ่าน GUI พอร์ตจะเปิดขึ้นสำหรับเครือข่ายส่วนตัวและโดเมนเท่านั้นและจะแบ่งกฎสำหรับสิ่งนี้ หลังจากเปิดใช้งานมีกฎ 4 ข้อใน Windows 8+ และ 2 กฎ (ไม่มี UDP) ใน Windows XP, Vista และ 7

การหลีกเลี่ยงสิ่งที่ฉันใช้อยู่ในขณะนี้คือการเพิ่มกฎของตัวเอง:

netsh.exe advfirewall firewall add rule name="Remote Desktop - User Mode (TCP-In)" dir=in action=allow program="%%SystemRoot%%\system32\svchost.exe" service="TermService" description="Inbound rule for the Remote Desktop service to allow RDP traffic. [TCP 3389] added by LogicDaemon's script" enable=yes profile=private,domain localport=3389 protocol=tcp
netsh.exe advfirewall firewall add rule name="Remote Desktop - User Mode (UDP-In)" dir=in action=allow program="%%SystemRoot%%\system32\svchost.exe" service="TermService" description="Inbound rule for the Remote Desktop service to allow RDP traffic. [UDP 3389] added by LogicDaemon's script" enable=yes profile=private,domain localport=3389 protocol=udp

แต่ไม่ดีเนื่องจาก (ไม่เหมือนกับมาตรฐาน) ผู้ใช้สามารถแก้ไขได้โดยไม่มีกลุ่ม (ทำงานกับสคริปต์อื่น ๆ ) และจะไม่ถูกปิดใช้งานโดยอัตโนมัติเมื่อ RDP ถูกปิดผ่าน GUI

ภาพหน้าจอ

กฎไฟร์วอลล์ก่อนเปิดใช้งาน RDP ผ่าน GUI เป็นครั้งแรก* **

กฎเดียวกันเมื่อเปิดใช้งาน RDP ผ่าน GUI (สถานะที่ฉันต้องการ):

และหลังจากปิดการใช้งาน RDP ใน GUI:


ฉันจะไม่เล่าเรื่องราวทั้งหมดของการต่อสู้นี้ด้วยโปรแกรมอรรถประโยชน์บรรทัดคำสั่งของ windows จนกว่าจะมีคนถาม นี่คือว่าเรื่องในรัสเซีย


1
ดังนั้นฉันจึงต้องแก้ไขเพื่อสรุปว่าคุณต้องการกฎไฟร์วอลล์ 2 ตัวที่เปิดใช้งาน UDP / TCP บนพอร์ต 3389 สำหรับโปรไฟล์ Domain และส่วนตัวเท่านั้นหรือไม่
นาธานไรซ์

เกือบจะ ก่อนอื่นใช่ฉันกำลังแก้ไขกฎในตัว ประการที่สองใช่ฉันต้องการกฎในตัวเพื่อเปิดใช้งาน 3389 บนเครือข่ายโดเมนและส่วนตัว แต่นี่จะเป็นส่วนที่ยุ่งยาก (ไม่เช่นนั้นจะตอบแล้ว): ก่อนอื่นมาพูดเกี่ยวกับ TCP ตามค่าเริ่มต้นไม่มีกฎแยกต่างหากสำหรับเครือข่าย {สาธารณะ} และ {Doman, ส่วนตัว} มีกฎหนึ่งข้อสำหรับเครือข่าย {All} แต่เมื่อเปิดใช้งาน RDP ผ่าน GUI จะมีกฎอยู่สองกฎกฎหนึ่งสำหรับ {สาธารณะ} และกฎหนึ่งสำหรับ {Doman, ส่วนตัว} เหมือนกับ UDP นอกจากนี้ฉันเพิ่มภาพหน้าจออาจชี้แจงด้วย
LogicDaemon

คำตอบ:


8
netsh firewall set service type = remotedesktop mode = enable

หรือ

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f

ฉันลองมัน netsh firewallเลิกใช้แล้ว (ตั้งแต่ win7) ไม่ทำงานใน Win10 และอนุญาตให้ rdp สำหรับเครือข่ายปัจจุบันเท่านั้น (หากคุณอยู่ในที่สาธารณะจะอนุญาตให้ rdp สำหรับเครือข่ายสาธารณะและจะไม่ทำงานในเครือข่ายส่วนตัวหลังจากนั้น) นี่เป็นข้อสังเกตในเรื่องดั้งเดิมฉันแค่คิดว่ามันไม่คุ้มค่าที่จะพูดถึงคำถาม ฉันจะแก้ไขข้อผิดพลาดนั้น
LogicDaemon

ในขณะที่เลิกใช้งานแล้วnetsh firewallยังคงใช้งานได้ใน Windows 10 (ทดสอบบน Pro)
ฉันพูดว่า Reinstate Monica

2
@Tistist ฉันยืนยันมันใช้งานได้ในรุ่น 1607 (สร้าง 14393.693) แน่นอน เมื่อฉันได้เขียนความคิดเห็นก่อนหน้าของฉันฉันทดสอบในรุ่นปัจจุบัน (ยังไม่มีรุ่น) และมันไม่ทำงาน
LogicDaemon

3

หากฉันเข้าใจคำถามอย่างถูกต้องสิ่งนี้จะช่วยให้คุณได้สิ่งที่คุณต้องการ นี่คือ PowerShell:

$FireWall = New-Object -comObject HNetCfg.FwPolicy2
$EnableRules = $FireWall.rules | Where-Object {$_.LocalPorts -like "*3389*" -and $_.Profiles -eq "3"}
ForEach ($Rule In $EnableRules){($Rule.Enabled = "True")}

สิ่งนี้จะกรองกฎและหยิบชื่อกฎที่ถูกต้องซึ่งไม่เชื่อเรื่องภาษา ทำได้โดยการกรองที่พอร์ต 3389 และค้นหากฎที่เกี่ยวข้องกับ "โดเมนและเครือข่ายส่วนตัว" Profiles -eq 3เป็นรูปแบบบิตแมปสำหรับเครือข่ายส่วนตัวและโดเมนคุณสามารถดูการอ้างอิงที่นี่:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366303(v=vs.85).aspx

โดยที่ 1 (เครือข่ายโดเมน) + 2 (เครือข่ายส่วนตัว) = 3

นี่คือลิงค์ MSDN ที่ฉันพบส่วนที่เหลือ:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365309(v=vs.85).aspx

และนี่คือวิธีที่ฉันค้นพบคุณสมบัติและวิธีการสำหรับวัตถุอื่น:

PS C:\> $FireWall | Get-Member


   TypeName: System.__ComObject#{98325047-c671-4174-8d81-defcd3f03186}

Name                                         MemberType            Definition
----                                         ----------            ----------
EnableRuleGroup                              Method                void EnableRuleGroup (int, string, bool)
IsRuleGroupEnabled                           Method                bool IsRuleGroupEnabled (int, string)
RestoreLocalFirewallDefaults                 Method                void RestoreLocalFirewallDefaults ()
BlockAllInboundTraffic                       ParameterizedProperty bool BlockAllInboundTraffic (NET_FW_PROFILE_TYPE2...
DefaultInboundAction                         ParameterizedProperty NET_FW_ACTION_ DefaultInboundAction (NET_FW_PROFI...
DefaultOutboundAction                        ParameterizedProperty NET_FW_ACTION_ DefaultOutboundAction (NET_FW_PROF...
ExcludedInterfaces                           ParameterizedProperty Variant ExcludedInterfaces (NET_FW_PROFILE_TYPE2_...
FirewallEnabled                              ParameterizedProperty bool FirewallEnabled (NET_FW_PROFILE_TYPE2_) {get...
IsRuleGroupCurrentlyEnabled                  ParameterizedProperty bool IsRuleGroupCurrentlyEnabled (string) {get}
NotificationsDisabled                        ParameterizedProperty bool NotificationsDisabled (NET_FW_PROFILE_TYPE2_...
UnicastResponsesToMulticastBroadcastDisabled ParameterizedProperty bool UnicastResponsesToMulticastBroadcastDisabled...
CurrentProfileTypes                          Property              int CurrentProfileTypes () {get}
LocalPolicyModifyState                       Property              NET_FW_MODIFY_STATE_ LocalPolicyModifyState () {g...
Rules                                        Property              INetFwRules Rules () {get}
ServiceRestriction                           Property              INetFwServiceRestriction ServiceRestriction () {g...



PS C:\> $Rules | Get-Member


   TypeName: System.__ComObject#{9c27c8da-189b-4dde-89f7-8b39a316782c}

Name                 MemberType Definition
----                 ---------- ----------
Action               Property   NET_FW_ACTION_ Action () {get} {set}
ApplicationName      Property   string ApplicationName () {get} {set}
Description          Property   string Description () {get} {set}
Direction            Property   NET_FW_RULE_DIRECTION_ Direction () {get} {set}
EdgeTraversal        Property   bool EdgeTraversal () {get} {set}
EdgeTraversalOptions Property   int EdgeTraversalOptions () {get} {set}
Enabled              Property   bool Enabled () {get} {set}
Grouping             Property   string Grouping () {get} {set}
IcmpTypesAndCodes    Property   string IcmpTypesAndCodes () {get} {set}
Interfaces           Property   Variant Interfaces () {get} {set}
InterfaceTypes       Property   string InterfaceTypes () {get} {set}
LocalAddresses       Property   string LocalAddresses () {get} {set}
LocalPorts           Property   string LocalPorts () {get} {set}
Name                 Property   string Name () {get} {set}
Profiles             Property   int Profiles () {get} {set}
Protocol             Property   int Protocol () {get} {set}
RemoteAddresses      Property   string RemoteAddresses () {get} {set}
RemotePorts          Property   string RemotePorts () {get} {set}
serviceName          Property   string serviceName () {get} {set}

ไม่แน่ใจว่าทำไม แต่มันบอกว่าไม่มีคุณสมบัติดังกล่าวi.imgur.com/A0OmzZ8.png ฉันเดาว่าเป็นเช่นนี้เพราะจนกว่า RDP จะเปิดใช้งานเป็นครั้งที่ 1 ผ่าน GUI ไม่มีกฎดังกล่าวมีกฎเดียวสำหรับเครือข่ายทั้งหมด (สาธารณะส่วนตัวโดเมน) แต่เมื่อเปิดใช้งานผ่าน GUI กฎนี้จะถูกแยก! นอกจากนี้ยังมีการพิมพ์ผิดที่)}
LogicDaemon

บน Windows 8 ไม่มีข้อผิดพลาด แต่ไม่มีอะไรจะทำทั้งหมดi.imgur.com/te0J1Q9.png กฎไฟร์วอลล์มองก่อนที่จะเปิด RDP ผ่าน GUI สำหรับครั้งแรก: i.imgur.com/sEIE0me.pngหลังจากการเปิดใช้งานแล้วปิดการใช้งานผ่านทาง GUI: i.imgur.com/PjnFOh1.png กฎเดียวกันเมื่อเปิดใช้งาน RDP ผ่าน GUI (สถานะที่ต้องการรับ): i.imgur.com/c3ywfHy.png
LogicDaemon

0

หากคุณกำลังมองหาโซลูชัน PowerShell สามารถใช้สิ่งต่อไปนี้:

Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP"
Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-UDP"

0

คำสั่ง cmd ต่อไปนี้ ..

netsh firewall set service type = remotedesktop mode = enable

และ

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /

ไม่เพียงพอที่จะเปิดใช้งานเดสก์ท็อประยะไกล

ฉันต้องเพิ่มอันนี้เพื่อใช้งานได้ (ไคลเอนต์: Windows 10)

netsh advfirewall firewall add rule name="Open Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.