Habilitar Escritorio remoto en el Firewall de Windows desde la línea de comandos


12

nota: # la etiqueta de línea de comandos no implica solo archivo por lotes, aceptaré un script de PowerShell o cualquier utilidad disponible gratuitamente, que se puede iniciar desde la línea de comandos y terminar su trabajo sin supervisión.


tl; dr

¿Cómo transformar desatendidamente las reglas del firewall exactamente para indicar la GUI, en Windows Vista a Windows 10 de cualquier idioma de interfaz (pantalla)?

Elaborando

Esta pregunta es similar a la # 786383 , pero no es la misma.

Básicamente, porque la respuesta no es buena para mí:

  1. set rule group="remote desktop" new enable=Yesabre el puerto 3389 para redes públicas, y quiero evitar eso. Además, los diferentes idiomas de Windows tienen diferentes nombres de grupo, pero necesito una solución universal.
  2. netsh firewall set service type = remotedesktop mode = enable tampoco funciona para mí: está en desuso desde win7 y permite rdp solo para la red actual (si está en una pública, 3389 se abrirá para redes públicas y no funcionará en redes privadas después).

Tenga en cuenta que antes de habilitar RDP mediante GUI, solo hay una regla por protocolo para RDP. Pero cuando RDP está habilitado a través de GUI, el puerto solo se abre para redes privadas y de dominio, y las reglas se dividen para esto. Después de habilitar, hay 4 reglas en Windows 8+ y 2 reglas (sin UDP) en Windows XP, Vista y 7.

La solución que estoy usando actualmente es agregar mis propias reglas:

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

pero eso es malo, porque (a diferencia de los estándares) pueden ser modificados por el usuario, no tienen grupo (para trabajar con otros scripts) y no se desactivan automáticamente cuando RDP se desactiva a través de la GUI.

Capturas de pantalla

Reglas de firewall antes de habilitar RDP mediante GUI por primera vez * **

Las mismas reglas cuando RDP está habilitado a través de GUI (estado que quiero obtener):

Y después de deshabilitar RDP en GUI:


No volveré a contar toda la historia de esta pelea con las utilidades de línea de comandos de Windows, hasta que alguien pregunte. Aquí está esa historia en ruso .


1
Entonces, ¿estoy en lo correcto al resumir que desea las 2 reglas de firewall integradas que habilitan UDP / TCP en el puerto 3389 solo para los perfiles de dominio y privado?
— Nathan Rice

casi. Primero, sí, estoy a punto de modificar las reglas integradas. En segundo lugar, sí, quiero reglas integradas para habilitar 3389 en redes de dominio y privadas. Pero aquí va la parte difícil (de lo contrario, ya estaría respondida): digamos primero sobre TCP. Por defecto, no hay reglas separadas para las redes {Public} y {Doman, Private}. Hay una regla para las redes {Todos}. Pero cuando RDP se habilita a través de GUI, aparecen dos reglas, una para {Public} y otra para {Doman, Private}. Lo mismo con UDP. También agregué capturas de pantalla, puede aclarar un poco también.
— LogicDaemon

Respuestas:


8
netsh firewall set service type = remotedesktop mode = enable

o

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

Lo intenté netsh firewallestá en desuso (desde win7), no funciona en Win10 y permite rdp solo para la red actual (si está en una pública, se permitirá rdp para redes públicas y no funcionará en redes privadas después). Esto se observa en la historia original, solo pensé que no vale la pena mencionarlo en cuestión. Arreglaré esa falla.
— LogicDaemon

Aunque de hecho está en desuso, netsh firewallaún funciona en Windows 10 (probado en Pro).
— Digo reinstalar a Mónica el

2
@Twisty confirmo que funciona en la versión 1607 (compilación 14393.693) de hecho. Cuando escribí mi comentario anterior, lo probé en la versión actual (aún no había ninguna versión) y no funcionó.
— LogicDaemon

3

Si entiendo la pregunta correctamente, esto te dará lo que quieres. Esto es 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")}

Esto filtrará las reglas y tomará los nombres correctos de las reglas independientes del lenguaje. Lo hace filtrando en el puerto 3389 y buscando la regla asociada con "Dominio y redes privadas". Profiles -eq 3es la máscara de mapa de bits para redes privadas y de dominio, puede ver la referencia aquí:

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

Donde 1 (redes de dominio) + 2 (redes privadas) = ​​3

Aquí está el enlace de MSDN donde descubrí el resto:

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

Y así es como descubrí cuáles eran las propiedades y los métodos para los otros objetos:

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}

No estoy seguro de por qué, pero dice que no existe tal propiedad i.imgur.com/A0OmzZ8.png . Supongo que esto se debe a que hasta que RDP se habilite por primera vez a través de la GUI, no existe una regla de este tipo, hay una sola regla para todas las redes (públicas, privadas, de dominio). Pero cuando se habilita a través de GUI, ¡esta regla se divide! También hay error tipográfico en)}
— LogicDaemon

en Windows 8, no hay ningún error, pero no se hace nada por completo i.imgur.com/te0J1Q9.png . Las reglas de firewall se ven antes de habilitar RDP a través de GUI por primera vez: i.imgur.com/sEIE0me.png , después de habilitar y luego deshabilitar a través de GUI: i.imgur.com/PjnFOh1.png . Las mismas reglas cuando RDP está habilitado a través de GUI (estado que quiero obtener): i.imgur.com/c3ywfHy.png
— LogicDaemon

0

Si está buscando la solución PowerShell, se puede usar lo siguiente:

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

0

Los siguientes comandos cmd.

netsh firewall set service type = remotedesktop mode = enable

y

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

no son suficientes para habilitar el escritorio remoto.

Tuve que agregar este para que funcione (Cliente: Windows 10).

netsh advfirewall firewall add rule name="Open Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.