Aktifkan Remote Desktop di Windows Firewall dari baris perintah

12

catatan: # tag baris perintah tidak menyiratkan batch-file-only, saya akan menerima skrip PowerShell atau utilitas apa pun yang tersedia secara bebas, yang dapat dimulai dari baris perintah dan menyelesaikan pekerjaannya tanpa pengawasan.


tl; dr

bagaimana mengubah aturan firewall tanpa pengawasan dengan tepat untuk menyatakan GUI, pada Windows Vista ke Windows 10 bahasa antarmuka (tampilan)?

Menguraikan

Pertanyaan ini mirip dengan # 786383 , tetapi tidak sama.

Pada dasarnya, karena jawaban tidak baik untuk saya:

  1. set rule group="remote desktop" new enable=Yesmembuka port 3389 untuk jaringan publik, dan saya ingin menghindarinya. Juga, bahasa Windows yang berbeda memiliki nama grup yang berbeda, tetapi saya memerlukan solusi universal.
  2. netsh firewall set service type = remotedesktop mode = enable Saya juga tidak bekerja untuk saya: ini sudah usang sejak win7, dan memungkinkan rdp hanya untuk jaringan saat ini (jika Anda berada di jaringan publik, 3389 akan dibuka untuk jaringan publik dan tidak akan berfungsi di jaringan pribadi setelah itu).

Perhatikan bahwa sebelum RDP diaktifkan melalui GUI, hanya ada satu aturan per protokol untuk RDP. Tetapi ketika RDP diaktifkan melalui GUI, port hanya dibuka untuk jaringan pribadi dan domain, dan aturan terpecah untuk ini. Setelah mengaktifkan, ada 4 aturan di Windows 8+ dan 2 aturan (tidak ada UDP) di Windows XP, Vista dan 7.

Bekerja di sekitar yang saya gunakan saat ini adalah menambahkan aturan saya sendiri:

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

tapi itu buruk, karena (tidak seperti yang standar) mereka dapat dimodifikasi oleh pengguna, tidak memiliki grup (untuk bekerja dengan skrip lain), dan jangan dinonaktifkan secara otomatis ketika RDP dimatikan melalui GUI.

Tangkapan layar

Aturan firewall sebelum mengaktifkan RDP melalui GUI untuk pertama kalinya * **

Aturan yang sama ketika RDP diaktifkan melalui GUI (status yang ingin saya dapatkan):

Dan setelah menonaktifkan RDP di GUI:


Saya tidak akan menceritakan kembali seluruh kisah pertarungan ini dengan utilitas baris perintah windows, sampai seseorang bertanya. Ini cerita dalam bahasa Rusia .

LogicDaemon
sumber
1
Jadi, apakah saya benar untuk meringkas bahwa Anda ingin 2 aturan firewall internal yang mengaktifkan UDP / TCP di Port 3389 hanya untuk profil Domain dan Pribadi?
Nathan Rice
hampir. Pertama, ya, saya akan memodifikasi aturan bawaan. Kedua, ya, saya ingin aturan bawaan mengaktifkan 3389 di domain dan jaringan pribadi. Tapi begini bagian yang sulit (kalau tidak itu akan dijawab): katakanlah dulu tentang TCP. Secara default, tidak ada aturan terpisah untuk jaringan {Public} dan {Doman, Private}. Ada satu aturan untuk jaringan {Semua}. Tetapi ketika RDP diaktifkan melalui GUI, muncul dua aturan, satu untuk {Publik} dan satu untuk {Doman, Pribadi}. Sama dengan UDP. Saya juga menambahkan tangkapan layar, dapat menjelaskan sedikit juga.
LogicDaemon

Jawaban:

8
netsh firewall set service type = remotedesktop mode = enable

atau

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
STTR
sumber
Saya mencobanya. netsh firewallsudah ditinggalkan (karena win7), tidak berfungsi di Win10, dan memungkinkan rdp hanya untuk jaringan saat ini (jika Anda berada di jaringan publik, rdp akan diizinkan untuk jaringan publik dan setelah itu tidak akan berfungsi di jaringan pribadi). Ini dicatat dalam cerita asli, saya hanya berpikir itu tidak layak disebutkan dalam pertanyaan. Saya akan memperbaiki kesalahan itu.
LogicDaemon
Meskipun memang sudah usang, netsh firewallmasih bekerja di Windows 10 (diuji pada Pro).
Saya katakan Reinstate Monica
2
@ Twisty saya konfirmasi, itu berfungsi dalam versi 1607 (build 14393.693) memang. Ketika saya sudah menulis komentar sebelumnya, saya mengujinya dalam versi saat ini (belum ada rilis), dan itu tidak berhasil.
LogicDaemon
3

Jika saya memahami pertanyaan dengan benar, ini akan memberi Anda apa yang Anda inginkan. Ini adalah 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")}

Ini akan menyaring aturan dan mengambil nama aturan yang benar agnostik bahasa. Ini dilakukan dengan memfilter pada port 3389 dan menemukan aturan yang terkait dengan "Domain dan jaringan pribadi". Profiles -eq 3adalah topeng bitmap untuk jaringan Pribadi dan Domain, Anda dapat melihat referensi di sini:

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

Di mana 1 (Jaringan domain) + 2 (Jaringan pribadi) = 3

Berikut ini tautan MSDN tempat saya menemukan sisanya:

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

Dan di sini adalah bagaimana saya menemukan apa properti dan metode untuk objek lain:

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}
Nathan Rice
sumber
tidak yakin mengapa, tetapi dikatakan tidak ada properti i.imgur.com/A0OmzZ8.png . Saya kira ini karena sampai RDP diaktifkan 1 kali melalui GUI, tidak ada aturan seperti itu, ada aturan tunggal untuk semua jaringan (publik, pribadi, domain). Tetapi ketika diaktifkan melalui GUI, aturan ini terpecah! Juga ada salah ketik di)}
LogicDaemon
pada Windows 8, tidak ada kesalahan, tetapi tidak ada yang dilakukan sama sekali i.imgur.com/te0J1Q9.png . Aturan firewall terlihat sebelum mengaktifkan RDP melalui GUI untuk pertama kalinya: i.imgur.com/sEIE0me.png , setelah mengaktifkan dan kemudian menonaktifkan melalui GUI: i.imgur.com/PjnFOh1.png . Aturan yang sama ketika RDP diaktifkan melalui GUI (negara bagian yang ingin saya dapatkan): i.imgur.com/c3ywfHy.png
LogicDaemon
0

Jika Anda mencari solusi PowerShell, berikut ini dapat digunakan:

Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP"
Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-UDP"
Jaans
sumber
0

Perintah cmd berikut ..

netsh firewall set service type = remotedesktop mode = enable

dan

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

tidak cukup untuk mengaktifkan desktop jarak jauh.

Saya harus menambahkan ini untuk membuatnya berfungsi (Klien: Windows 10).

netsh advfirewall firewall add rule name="Open Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
Andy McRae
sumber