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 .

LogicDaemon
fuente
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
STTR
fuente
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}
Nathan Rice
fuente
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"
Jaans
fuente
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
Andy McRae
fuente