Aktivieren Sie Remotedesktop in der Windows-Firewall über die Befehlszeile

12

Hinweis: # Befehlszeilen-Tag bedeutet nicht nur Batch-Datei. Ich akzeptiere ein PowerShell-Skript oder ein frei verfügbares Dienstprogramm, das über die Befehlszeile gestartet werden kann und seine Arbeit unbeaufsichtigt beendet.


tl; dr

Wie kann man Firewall-Regeln unbeaufsichtigt genau so umwandeln, dass die GUI es unter Windows Vista auf Windows 10 einer beliebigen Schnittstellensprache (Anzeige) ausdrückt?

Ausarbeiten

Diese Frage ähnelt # 786383 , ist aber nicht dieselbe.

Grundsätzlich, weil die Antwort nicht gut für mich ist:

  1. set rule group="remote desktop" new enable=Yesöffnet Port 3389 für öffentliche Netzwerke, und das möchte ich vermeiden. Auch verschiedene Windows-Sprachen haben unterschiedliche Gruppennamen, aber ich brauche eine universelle Lösung.
  2. netsh firewall set service type = remotedesktop mode = enable funktioniert auch bei mir nicht: es ist seit win7 veraltet und erlaubt rdp nur für das aktuelle netzwerk (wenn Sie in einem öffentlichen Netzwerk sind, wird 3389 für öffentliche Netzwerke geöffnet und funktioniert danach nicht mehr in privaten Netzwerken).

Beachten Sie, dass es vor der Aktivierung von RDP über die GUI nur eine Regel pro Protokoll für RDP gibt. Wenn RDP jedoch über die GUI aktiviert wird, wird der Port nur für private Netzwerke und Domänennetzwerke geöffnet, und die Regeln werden dafür aufgeteilt. Nach dem Aktivieren gibt es 4 Regeln in Windows 8+ und 2 Regeln (kein UDP) in Windows XP, Vista und 7.

Umgehung, die ich derzeit verwende, fügt meine eigenen Regeln hinzu:

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

Das ist jedoch schlecht, da sie (im Gegensatz zu Standardprogrammen) vom Benutzer geändert werden können, keine Gruppe haben (um mit anderen Skripten zu arbeiten) und nicht automatisch deaktiviert werden, wenn RDP über die GUI deaktiviert wird.

Screenshots

Firewall-Regeln vor dem erstmaligen Aktivieren von RDP über die GUI * **

Gleiche Regeln, wenn RDP über die GUI aktiviert ist (Status, den ich erhalten möchte):

Und nach dem Deaktivieren von RDP in der GUI:


Ich werde die ganze Geschichte dieses Kampfes mit Windows-Befehlszeilenprogrammen nicht nacherzählen, bis jemand danach fragt. Hier ist diese Geschichte auf Russisch .

LogicDaemon
quelle
1
Bin ich also richtig, um zusammenzufassen, dass Sie die 2 integrierten Firewall-Regeln möchten, die UDP / TCP auf Port 3389 nur für die Domänen- und privaten Profile aktivieren?
Nathan Rice
fast. Erstens, ja, ich möchte integrierte Regeln ändern. Zweitens, ja, ich möchte integrierte Regeln, um 3389 in Domänen- und privaten Netzwerken zu aktivieren. Aber hier ist der schwierige Teil (sonst würde er bereits beantwortet): Sagen wir zuerst über TCP. Standardmäßig gibt es keine separaten Regeln für {Public} - und {Doman, Private} -Netzwerke. Es gibt eine Regel für {Alle} Netzwerke. Wenn RDP jedoch über die GUI aktiviert ist, werden zwei Regeln angezeigt, eine für {Public} und eine für {Doman, Private}. Gleiches gilt für UDP. Auch ich habe Screenshots hinzugefügt, kann auch ein bisschen klarstellen.
LogicDaemon

Antworten:

8
netsh firewall set service type = remotedesktop mode = enable

oder

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
STTR
quelle
Das habe ich versucht. netsh firewallist veraltet (seit win7), funktioniert nicht in Win10 und erlaubt rdp nur für das aktuelle Netzwerk (wenn Sie in einem öffentlichen Netzwerk sind, ist rdp für öffentliche Netzwerke zulässig und funktioniert danach nicht mehr in privaten Netzwerken). Dies ist in der Originalgeschichte vermerkt, ich dachte nur, dass es nicht wert ist, in Frage gestellt zu werden. Ich werde diesen Fehler beheben.
LogicDaemon
Obwohl in der Tat veraltet, netsh firewallfunktioniert immer noch in Windows 10 (auf Pro getestet).
Ich sage Reinstate Monica
2
@ Twisty Ich bestätige, es funktioniert in der Tat in Version 1607 (Build 14393.693). Als ich meinen vorherigen Kommentar geschrieben habe, habe ich ihn in der aktuellen Version getestet (es gab noch keine Veröffentlichung) und es hat nicht funktioniert.
LogicDaemon
3

Wenn ich die Frage richtig verstehe, bekommst du das, was du willst. Dies ist 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")}

Dadurch werden die Regeln herausgefiltert und die korrekten Regelnamen ermittelt, die unabhängig von der Sprache sind. Dazu wird nach Port 3389 gefiltert und die Regel für "Domänen- und private Netzwerke" ermittelt. Profiles -eq 3ist die Bitmap-Maske für private und Domain-Netzwerke. Die Referenz finden Sie hier:

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

Wobei 1 (Domänennetzwerke) + 2 (private Netzwerke) = 3

Hier ist der MSDN-Link, über den ich den Rest herausgefunden habe:

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

Und so habe ich herausgefunden, welche Eigenschaften und Methoden für die anderen Objekte gelten:

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
quelle
Ich weiß nicht warum, aber es heißt, dass es keine solche Eigenschaft gibt i.imgur.com/A0OmzZ8.png . Ich denke, das liegt daran, dass es bis zur ersten Aktivierung von RDP über die GUI keine solche Regel gibt. Es gibt eine einzige Regel für alle Netzwerke (öffentlich, privat, Domain). Bei Aktivierung über die GUI wird diese Regel jedoch aufgeteilt! Es gibt auch Tippfehler bei)}
LogicDaemon
Unter Windows 8 gibt es keinen Fehler, aber insgesamt wird nichts unternommen. i.imgur.com/te0J1Q9.png . Firewall-Regeln prüfen , bevor RDP zum ersten Mal über die GUI aktiviert wird : i.imgur.com/sEIE0me.png , nach dem Aktivieren und Deaktivieren über die GUI: i.imgur.com/PjnFOh1.png . Gleiche Regeln, wenn RDP über die GUI aktiviert ist (Status, den ich erhalten möchte): i.imgur.com/c3ywfHy.png
LogicDaemon
0

Wenn Sie nach einer PowerShell-Lösung suchen, können Sie Folgendes verwenden:

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

Die folgenden cmd-Befehle ..

netsh firewall set service type = remotedesktop mode = enable

und

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

reichen nicht aus, um den Remotedesktop zu aktivieren.

Ich musste dieses hinzufügen, damit es funktioniert (Client: Windows 10).

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