Activer le Bureau à distance dans le pare-feu Windows à partir de la ligne de commande


12

Remarque: # la balise de ligne de commande n'implique pas uniquement un fichier de commandes, j'accepterai un script PowerShell ou tout autre utilitaire disponible gratuitement, qui peut être démarré à partir de la ligne de commande et terminer son travail sans surveillance.


tl; dr

comment transformer sans surveillance des règles de pare-feu exactement pour que GUI l'exprime, sur Windows Vista vers Windows 10 de n'importe quelle langue d'interface (affichage)?

Élaborer

Cette question est similaire à # 786383 , mais ce n'est pas la même chose.

Fondamentalement, parce que la réponse n'est pas bonne pour moi:

  1. set rule group="remote desktop" new enable=Yesouvre le port 3389 pour les réseaux publics, et je veux éviter cela. De plus, différentes langues Windows ont des noms de groupe différents, mais j'ai besoin d'une solution universelle.
  2. netsh firewall set service type = remotedesktop mode = enable ne fonctionne pas non plus pour moi: il est obsolète depuis win7 et n'autorise le rdp que pour le réseau actuel (si vous en êtes un public, 3389 sera ouvert pour les réseaux publics et ne fonctionnera pas dans les réseaux privés par la suite).

Notez qu'avant que RDP soit activé via l'interface graphique, il n'y a qu'une seule règle par protocole pour RDP. Mais lorsque RDP est activé via l'interface graphique, le port n'est ouvert que pour les réseaux privés et de domaine, et les règles sont divisées pour cela. Après l'activation, il existe 4 règles dans Windows 8+ et 2 règles (pas UDP) dans Windows XP, Vista et 7.

La solution de contournement que j'utilise actuellement ajoute mes propres règles:

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

mais c'est mauvais, car (contrairement aux standards) ils peuvent être modifiés par l'utilisateur, n'ont pas de groupe (pour travailler avec d'autres scripts), et ne sont pas automatiquement désactivés lorsque RDP est désactivé via l'interface graphique.

Captures d'écran

Règles de pare-feu avant d'activer RDP via GUI pour la première fois * **

Mêmes règles lorsque RDP est activé via l'interface graphique (état que je souhaite obtenir):

Et après avoir désactivé RDP dans l'interface graphique:


Je ne raconterai pas toute l'histoire de ce combat avec les utilitaires de ligne de commande Windows, jusqu'à ce que quelqu'un le demande. Voici cette histoire en russe .


1
Donc, ai-je raison de résumer que vous voulez les 2 règles de pare-feu intégrées qui activent UDP / TCP sur le port 3389 uniquement pour les profils de domaine et privé?
Nathan Rice du

presque. Tout d'abord, oui, je suis sur la modification des règles intégrées. Deuxièmement, oui, je veux que les règles intégrées activent 3389 sur les réseaux de domaine et privés. Mais voici la partie délicate (sinon il serait déjà répondu): disons d'abord sur TCP. Par défaut, il n'y a pas de règles distinctes pour les réseaux {Public} et {Doman, Private}. Il existe une règle pour les réseaux {Tous}. Mais lorsque RDP est activé via l'interface graphique, il apparaît deux règles, une pour {Public} et une pour {Doman, Private}. Même chose avec UDP. J'ai également ajouté des captures d'écran, peut-être clarifier un peu aussi.
LogicDaemon

Réponses:


8
netsh firewall set service type = remotedesktop mode = enable

ou

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

J'ai essayé ça. netsh firewallest obsolète (depuis win7), ne fonctionne pas dans Win10 et autorise le rdp pour le réseau actuel uniquement (si vous êtes dans un réseau public, le rdp sera autorisé pour les réseaux publics et ne fonctionnera pas dans les réseaux privés par la suite). Ceci est noté dans l'histoire originale, je pensais juste que ça ne valait pas la peine d'être mentionné en question. Je vais réparer ce défaut.
LogicDaemon

Bien netsh firewallqu'en effet obsolète, fonctionne toujours dans Windows 10 (testé sur Pro).
Je dis Réintégrer Monica le

2
@Twisty Je confirme, cela fonctionne en effet dans la version 1607 (build 14393.693). Lorsque j'ai écrit mon commentaire précédent, je l'ai testé dans la version actuelle (il n'y avait pas encore de version), et cela n'a pas fonctionné.
LogicDaemon

3

Si je comprends bien la question, cela vous donnera ce que vous voulez. Voici 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")}

Cela filtrera les règles et récupérera les noms de règles corrects indépendamment du langage. Il le fait en filtrant sur le port 3389 et en trouvant la règle associée à "Domaine et réseaux privés". Profiles -eq 3est le masque bitmap pour les réseaux privés et de domaine, vous pouvez voir la référence ici:

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

Où 1 (réseaux de domaine) + 2 (réseaux privés) = 3

Voici le lien MSDN où j'ai compris le reste:

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

Et voici comment j'ai compris quelles étaient les propriétés et les méthodes des autres objets:

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}

Je ne sais pas pourquoi, mais il dit qu'il n'y a pas une telle propriété i.imgur.com/A0OmzZ8.png . Je suppose que c'est parce que jusqu'à ce que RDP soit activé la première fois via l'interface graphique, il n'y a pas une telle règle, il y a une règle unique pour tous les réseaux (public, privé, domaine). Mais lorsqu'elle est activée via l'interface graphique, cette règle est divisée! Il y a aussi une faute de frappe à)}
LogicDaemon

sur Windows 8, il n'y a pas d'erreur, mais rien n'est fait au total i.imgur.com/te0J1Q9.png . Les règles de pare-feu regardent avant d'activer RDP via GUI pour la première fois: i.imgur.com/sEIE0me.png , après l'activation puis la désactivation via GUI: i.imgur.com/PjnFOh1.png . Mêmes règles lorsque RDP est activé via l'interface graphique (état que je souhaite obtenir): i.imgur.com/c3ywfHy.png
LogicDaemon

0

Si vous recherchez une solution PowerShell, les éléments suivants peuvent être utilisés:

Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP"
Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-UDP"

0

Les commandes cmd suivantes ..

netsh firewall set service type = remotedesktop mode = enable

et

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

ne sont pas suffisants pour activer le bureau à distance.

J'ai dû ajouter celui-ci pour le faire fonctionner (Client: Windows 10).

netsh advfirewall firewall add rule name="Open Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.