Habilitar a Área de Trabalho Remota no Firewall do Windows na linha de comando

12

Observação: a tag da linha de comando não implica apenas em lote, aceitarei um script do PowerShell ou qualquer utilitário disponível gratuitamente, que pode ser iniciado na linha de comando e concluir seu trabalho sem supervisão.


tl; dr

como transformar autonomamente as regras de firewall exatamente para indicar a GUI, no Windows Vista para o Windows 10 de qualquer idioma da interface (exibição)?

Elaboração

Esta pergunta é semelhante à # 786383 , mas não é a mesma.

Basicamente, porque a resposta não é boa para mim:

  1. set rule group="remote desktop" new enable=Yesabre a porta 3389 para redes públicas e quero evitar isso. Além disso, idiomas diferentes do Windows têm nomes de grupos diferentes, mas eu preciso de uma solução universal.
  2. netsh firewall set service type = remotedesktop mode = enable também não está funcionando para mim: está obsoleto desde o win7 e permite rdp somente para a rede atual (se você estiver em uma pública, o 3389 será aberto para redes públicas e não funcionará em redes privadas posteriormente).

Observe que, antes de o RDP ser ativado via GUI, há apenas uma regra por protocolo para o RDP. Mas quando o RDP é ativado via GUI, a porta é aberta apenas para redes privadas e de domínio, e as regras são divididas para isso. Após a ativação, existem 4 regras no Windows 8+ e 2 regras (sem UDP) no Windows XP, Vista e 7.

A solução alternativa que estou usando no momento está adicionando minhas próprias regras:

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

mas isso é ruim, porque (ao contrário dos padrões) eles podem ser modificados pelo usuário, não têm grupo (para trabalhar com outros scripts) e não são desativados automaticamente quando o RDP é desativado via GUI.

Screenshots

Regras de firewall antes de ativar o RDP via GUI pela primeira vez * **

Mesmas regras quando o RDP é ativado via GUI (estado que desejo obter):

E depois de desativar o RDP na GUI:


Não vou recontar toda a história dessa luta com os utilitários de linha de comando do Windows, até que alguém pergunte. Aqui está essa história em russo .

LogicDaemon
fonte
1
Então, estou correto em resumir que você deseja que as 2 regras de firewall internas ativem o UDP / TCP na porta 3389 apenas para os perfis Domínio e Privado?
22615 Nathan Rice
quase. Primeiro, sim, eu estou sobre a modificação de regras internas. Segundo, sim, quero que as regras internas habilitem o 3389 nas redes Domínio e Privada. Mas aqui vai a parte complicada (caso contrário, já seria respondida): digamos primeiro sobre o TCP. Por padrão, não há regras separadas para as redes {Public} e {Doman, Private}. Há uma regra para {Todas} redes. Mas quando o RDP é ativado via GUI, aparecem duas regras, uma para {Public} e outra para {Doman, Private}. O mesmo com o UDP. Também adicionei capturas de tela, também posso esclarecer um pouco.
precisa saber é o seguinte

Respostas:

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
STTR
fonte
Eu tentei isso. netsh firewallestá obsoleto (desde win7), não funciona no Win10 e permite rdp somente para a rede atual (se você estiver em uma pública, o rdp será permitido para redes públicas e não funcionará em redes privadas posteriormente). Isso é observado na história original, eu apenas pensei que não vale a pena mencionar em questão. Eu vou consertar essa falha.
LogicDaemon
Embora realmente obsoleto, netsh firewallainda funciona no Windows 10 (testado no Pro).
Eu digo Restabelecer Monica
2
@ Twisty, confirmo que funciona na versão 1607 (compilação 14393.693). Quando escrevi meu comentário anterior, testei-o na versão atual (ainda não havia versão) e não funcionou.
LogicDaemon
3

Se eu entendi a pergunta corretamente, você obterá o que deseja. Este é o 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")}

Isso filtrará as regras e obterá os nomes de regras corretos, independentes do idioma. Isso é feito filtrando a porta 3389 e localizando a regra associada a "Domínio e redes privadas". Profiles -eq 3é a máscara de bitmap para redes privadas e de domínio, você pode ver a referência aqui:

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

Onde 1 (redes de domínio) + 2 (redes privadas) = ​​3

Aqui está o link do MSDN onde eu descobri o resto:

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

E aqui está como eu descobri quais eram as propriedades e métodos para os outros 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
fonte
não sei por que, mas diz que não existe tal propriedade i.imgur.com/A0OmzZ8.png . Eu acho que é porque até o RDP ser ativado pela primeira vez via GUI, não existe uma regra, existe uma regra única para todas as redes (pública, privada, domínio). Mas quando ativada via GUI, essa regra é dividida! Também há erro de digitação em)}
LogicDaemon
no Windows 8, não há erro, mas nada é feito completamente i.imgur.com/te0J1Q9.png . As regras de firewall examinam antes de ativar o RDP via GUI pela primeira vez: i.imgur.com/sEIE0me.png , depois de ativar e desativar a GUI: i.imgur.com/PjnFOh1.png . Mesmas regras quando RDP está habilitado via GUI (estado Quero chegar): i.imgur.com/c3ywfHy.png
LogicDaemon
0

Se você estiver procurando pela solução PowerShell, pode ser usado o seguinte:

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

Os seguintes comandos cmd ..

netsh firewall set service type = remotedesktop mode = enable

e

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

não são suficientes para ativar a área de trabalho remota.

Eu tive que adicionar este para fazer o trabalho (cliente: Windows 10).

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