Włącz Pulpit zdalny w Zaporze systemu Windows z wiersza polecenia

10

Uwaga: Tag # wiersza polecenia nie oznacza tylko pliku wsadowego, zaakceptuję skrypt PowerShell lub dowolne swobodnie dostępne narzędzie, które można uruchomić z wiersza poleceń i zakończyć pracę bez nadzoru.


tl; dr

jak bezobsługowo transformować reguły zapory ogniowej dokładnie tak, jak to określa GUI, w systemie Windows Vista na Windows 10 dowolnego języka interfejsu (wyświetlacza)?

Opracowanie

To pytanie jest podobne do # 786383 , ale to nie to samo.

Zasadniczo, ponieważ odpowiedź nie jest dla mnie dobra:

  1. set rule group="remote desktop" new enable=Yesotwiera port 3389 dla sieci publicznych i chcę tego uniknąć. Ponadto różne języki systemu Windows mają różne nazwy grup, ale potrzebuję uniwersalnego rozwiązania.
  2. netsh firewall set service type = remotedesktop mode = enable też dla mnie nie działa: jest przestarzałe od win7 i pozwala na rdp tylko dla bieżącej sieci (jeśli jesteś publiczny, 3389 zostanie otwarty dla sieci publicznych i później nie będzie działał w sieciach prywatnych).

Należy pamiętać, że zanim protokół RDP zostanie włączony za pośrednictwem interfejsu GUI, istnieje tylko jedna reguła dla protokołu dla protokołu RDP. Ale gdy protokół RDP jest włączony za pośrednictwem interfejsu GUI, port jest otwierany tylko dla sieci prywatnych i domenowych, a zasady są podzielone. Po włączeniu istnieją 4 reguły w Windows 8+ i 2 reguły (bez UDP) w Windows XP, Vista i 7.

Obejściem, którego obecnie używam, jest dodawanie własnych reguł:

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

ale to źle, ponieważ (w przeciwieństwie do standardowych) mogą być modyfikowane przez użytkownika, nie mają grupy (do pracy z innymi skryptami) i nie są automatycznie wyłączane, gdy RDP jest wyłączany przez GUI.

Zrzuty ekranu

Reguły zapory przed pierwszym włączeniem protokołu RDP za pośrednictwem graficznego interfejsu użytkownika * **

Te same zasady, gdy protokół RDP jest włączony za pośrednictwem GUI (stan, który chcę uzyskać):

A po wyłączeniu RDP w GUI:


Nie będę opowiadał całej historii tej walki za pomocą narzędzi wiersza poleceń systemu Windows, dopóki ktoś nie zapyta. Oto ta historia po rosyjsku .

LogicDaemon
źródło
1
Czy mam zatem rację, podsumowując, że chcesz 2 wbudowane reguły zapory ogniowej, które włączają UDP / TCP na porcie 3389 tylko dla profili domeny i prywatnych?
Nathan Rice,
prawie. Po pierwsze, tak, mam na myśli modyfikację wbudowanych reguł. Po drugie, tak, chcę, aby wbudowane reguły włączały 3389 w domenach i sieciach prywatnych. Ale tutaj jest podchwytliwa część (w przeciwnym razie byłaby to odpowiedź): najpierw powiedzmy o TCP. Domyślnie nie ma osobnych reguł dla sieci {Public} i {Doman, Private}. Istnieje jedna reguła dla sieci {All}. Ale kiedy RDP jest włączony przez GUI, pojawiają się dwie reguły, jedna dla {Public} i jedna dla {Doman, Private}. To samo z UDP. Dodałem również zrzuty ekranu, może też trochę wyjaśnić.
LogicDaemon

Odpowiedzi:

8
netsh firewall set service type = remotedesktop mode = enable

lub

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
STTR
źródło
Próbowałem tego. netsh firewalljest przestarzałe (od win7), nie działa w Win10 i pozwala na rdp tylko dla bieżącej sieci (jeśli jesteś w publicznej, rdp będzie dozwolony dla sieci publicznych i później nie będzie działał w sieciach prywatnych). Jest to odnotowane w oryginalnej historii, po prostu pomyślałem, że nie warto o tym wspominać. Naprawię tę wadę.
LogicDaemon
Chociaż faktycznie przestarzały, netsh firewallnadal działa w systemie Windows 10 (testowany na Pro).
Twisty Impersonator
2
@Twisty Potwierdzam, że rzeczywiście działa w wersji 1607 (kompilacja 14393.693). Kiedy pisałem mój poprzedni komentarz, przetestowałem go w bieżącej wersji (nie było jeszcze wydania) i nie zadziałało.
LogicDaemon
3

Jeśli dobrze zrozumiem pytanie, dostaniesz to, czego chcesz. To jest 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")}

Spowoduje to odfiltrowanie reguł i pobranie prawidłowych nazw reguł niezależnie od języka. Robi to, filtrując port 3389 i znajdując regułę związaną z „Domeną i sieciami prywatnymi”. Profiles -eq 3jest maską bitmapową dla sieci prywatnych i domenowych, możesz zobaczyć odniesienie tutaj:

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

Gdzie 1 (sieci domen) + 2 (sieci prywatne) = 3

Oto link MSDN, w którym wymyśliłem resztę:

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

Oto, jak zorientowałem się, jakie były właściwości i metody dla innych obiektów:

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
źródło
nie jestem pewien dlaczego, ale mówi, że nie ma takiej właściwości i.imgur.com/A0OmzZ8.png . Myślę, że dzieje się tak, ponieważ dopóki RDP nie zostanie włączony 1 raz za pomocą GUI, nie ma takiej reguły, istnieje jedna reguła dla wszystkich sieci (publicznej, prywatnej, domeny). Ale po włączeniu za pomocą GUI ta zasada jest podzielona! Jest też literówka w)}
LogicDaemon
w systemie Windows 8 nie ma błędu, ale nic nie jest zrobione i.imgur.com/te0J1Q9.png . Reguły zapory sprawdzają się przed włączeniem RDP za pośrednictwem GUI: i.imgur.com/sEIE0me.png , po włączeniu, a następnie wyłączeniu przez GUI: i.imgur.com/PjnFOh1.png . Te same zasady, gdy protokół
LogicDaemon