Включить удаленный рабочий стол в брандмауэре Windows из командной строки

12

примечание: тег командной строки # не подразумевает только пакетный файл, я приму скрипт PowerShell или любую свободно доступную утилиту, которую можно запустить из командной строки и завершить свою работу без присмотра.


ТЛ; др

Как автоматически преобразовать правила брандмауэра в состояние, в котором он находится, в 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 включен через графический интерфейс, порт открывается только для частных сетей и сетей домена, и правила для этого делятся. После включения в Windows 8+ есть 4 правила и 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, пока кто-нибудь не спросит. Вот эта история на русском языке .

LogicDaemon
источник
1
Итак, правильно ли я могу подвести итог, что вам нужны 2 встроенных правила брандмауэра, которые разрешают UDP / TCP на порт 3389 только для профилей домена и частного?
Натан Райс
почти. Во-первых, да, я собираюсь изменить встроенные правила. Во-вторых, да, я хочу, чтобы встроенные правила включали 3389 в доменных и частных сетях. Но здесь начинается сложная часть (в противном случае на это уже будет дан ответ): давайте сначала поговорим о TCP. По умолчанию не существует отдельных правил для сетей {Public} и {Doman, Private}. Существует одно правило для {All} сетей. Но когда RDP включен через GUI, появляются два правила, одно для {Public} и одно для {Doman, Private}. То же самое с 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
STTR
источник
Я попробовал это. netsh firewallустарела (начиная с win7), не работает в Win10 и разрешает rdp только для текущей сети (если вы общедоступны, rdp будет разрешен для публичных сетей и впоследствии не будет работать в частных сетях). Это отмечено в оригинальной истории, я просто подумал, что не стоит упоминать в вопросе. Я исправлю эту ошибку.
LogicDaemon
Хотя действительно устарел, netsh firewallвсе еще работает в Windows 10 (проверено на Pro).
Я говорю: восстанови Монику
2
@ Подтверждаю, это действительно работает в версии 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 раз через графический интерфейс, такого правила не существует, существует единое правило для всех сетей (общедоступных, частных, доменных). Но при включении через графический интерфейс это правило разделяется! Также есть опечатка в)}
LogicDaemon
в Windows 8 ошибки нет, но вообще ничего не делается i.imgur.com/te0J1Q9.png . Правила брандмауэра перед первым включением RDP через GUI: i.imgur.com/sEIE0me.png , после включения и отключения через GUI: i.imgur.com/PjnFOh1.png . Те же правила, когда RDP включен через графический интерфейс (состояние, которое я хочу получить): i.imgur.com/c3ywfHy.png
LogicDaemon
0

Если вы ищете решение PowerShell, можно использовать следующее:

Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP"
Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-UDP"
Jaans
источник
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
Энди МакРей
источник