Увімкніть віддалений робочий стіл у брандмауері Windows з командного рядка


12

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


тл; д-р

як без уважного перетворення правил брандмауера саме в стан 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
Тож я маю право підсумовувати, що ви хочете, щоб два вбудовані правила брандмауера, які дозволяють 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

Я спробував це. netsh firewallзастаріла (оскільки win7), не працює в Win10, і дозволяє rdp тільки для поточної мережі (якщо ви є у відкритій, rdp буде дозволено для публічних мереж і не працюватиме в приватних мережах згодом). Це зазначається в оригінальній історії, я просто вважав, що не варто згадувати про це. Я виправлю цю провину.
LogicDaemon

Незважаючи на те, що насправді застаріло, він netsh firewallвсе ще працює в Windows 10 (тестується на Pro).
Я кажу, відновіть Моніку

2
@Twisty Я підтверджую, що він працює у версії 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 не ввімкнуто вперше через 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.