10

примечание: тег командной строки # не подразумевает только пакетный файл, я приму скрипт 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 будет включен через графический интерфейс, для каждого протокола существует только одно правило для RDP. Но когда RDP включен через GUI, порт открывается только для частных и доменных сетей, и правила для этого делятся. После включения в 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, пока кто-нибудь не спросит. Вот эта история на русском языке.

2 ответа2

7
netsh firewall set service type = remotedesktop mode = enable

или же

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
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}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .