Desconexões em massa no RDS/RemoteApp no Windows Server 2019 com Event ID 40 e reason code 3489660929 (0xD0000001). Este guia prático reúne causa provável, correções confirmadas, mitigação por GPO (forçar TCP) e um passo a passo testado em campo para estabilizar o ambiente rapidamente.
Visão geral do problema
Em alguns ambientes de Remote Desktop Services (RDS) e RemoteApp baseados no Windows Server 2019, observou-se que todos os usuários de um dos hosts eram desconectados de forma intermitente—muitas vezes quase simultaneamente—sem alterações explícitas de rede ou manutenção planejada. No Event Viewer, a trilha típica é:
- Log: Microsoft‑Windows‑TerminalServices‑LocalSessionManager/Operational
- Event ID: 40
- Mensagem: “Session X has been disconnected, reason code 3489660929”
- Reason code (hex): 0xD0000001 (código genérico)
Forçar a conexão RDP a usar TCP (desligando UDP) apenas no cliente—via Registro—não resolveu o problema de forma consistente em vários cenários.
Causa mais provável (consolidada em campo)
Relatos consistentes de administradores indicaram associação com a atualização KB5041578 (Monthly Rollup de agosto/2024 para Windows Server 2019). Os sintomas cessaram imediatamente após sua remoção em diversos ambientes.
Resumo: Desinstalar o KB5041578 resolveu o problema em hosts afetados. Em seguida, atualizar para uma cumulativa mais recente (por exemplo, de novembro/2024, em um dos relatos) manteve o ambiente estável. Atenção: cumulativas posteriores podem reintroduzir o conteúdo problemático; valide sempre após atualizar.
Como confirmar rapidamente
Antes de agir, confirme o quê está acontecendo, onde e quando. Use os comandos abaixo para acelerar o diagnóstico.
Comandos rápidos de verificação
# Verificar se o KB problemático está instalado
Get-HotFix -Id KB5041578
Listar as últimas atualizações instaladas
Get-HotFix | Sort-Object InstalledOn -Descending |
Select-Object -First 20 Source,HotFixID,InstalledOn
Extrair desconexões (Event ID 40)
Get-WinEvent -LogName 'Microsoft-Windows-TerminalServices-LocalSessionManager/Operational' |
Where-Object {$\_.Id -eq 40} |
Select-Object TimeCreated, Message | Format-List
Sinal | O que significa | Ação recomendada |
---|---|---|
KB5041578 presente | Host potencialmente afetado pelo bug | Remover KB e validar; depois, atualizar para cumulativa mais recente que contenha o fix |
Event ID 40 com reason 3489660929 | Desconexão genérica (0xD0000001) | Correlacionar com instalação de updates e picos de rede; seguir o passo a passo |
Sem o KB e sintomas persistem | Outra causa (rede, driver, inspeção UDP, etc.) | Aplicar mitigação TCP, revisar drivers e inspeções, fazer captura e auditoria |
Correção definitiva recomendada
Priorize corrigir a origem do problema. A sequência abaixo reflete o que funcionou de forma consistente em campo.
Identificar e remover o KB problemático
- Confirmar presença do KB:
Get-HotFix -Id KB5041578
- Agendar janela de manutenção (para evitar impacto em horário de expediente).
- Desinstalar a atualização:
wusa.exe /uninstall /kb:5041578 /quiet /norestart
Se preferir usar DISM (útil quando o WUSA falha ou para automação granular):# Localizar o nome do pacote associado ao KB dism /online /get-packages | findstr 5041578 Remover (substitua NOME\DO\PACOTE pelo valor exato retornado acima) dism /online /remove-package /packagename\:NOME\DO\PACOTE /quiet /norestart
- Reiniciar o host ao final da janela (evite “power off” forçado; aguarde clean shutdown).
Evitar reinstalação involuntária
- WSUS: efetuar Decline especificamente para o KB/rollup que causou instabilidade e revisar regras de aprovação automática.
- Windows Update for Business (WUfB): ajustar temporariamente a política de adiamento para permitir a instalação da cumulativa mais recente que contenha a correção; depois, restabelecer o adiamento conforme o padrão da organização.
Políticas úteis (GPO) para WUfB
- Computer Configuration → Administrative Templates → Windows Update → Windows Update for Business
- Select when Quality Updates are received: reduzir o deferral a 0–1 dia para buscar a cumulativa mais nova; após estabilizar, retorne ao valor regular.
Para disparar uma verificação de updates:
# Em versões mais recentes, o uso do USOClient é restrito por políticas.
Caso sua organização utilize o módulo PSWindowsUpdate:
Install-Module -Name PSWindowsUpdate
Get-WindowsUpdate -AcceptAll -Install -IgnoreReboot
Mitigações enquanto a correção definitiva não é possível
Se o seu SLA não permite remoção imediata da atualização ou se você precisa de estabilidade emergencial até a próxima janela, use as alternativas abaixo.
Forçar TCP (desligar UDP) via GPO
Aplicar tanto no cliente quanto no host RDS:
- Clientes: Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Connection Client → Turn off UDP On Client = Enabled
- Servidores (Session Host): Administrative Templates → Windows Components → Remote Desktop Session Host → Select RDP transport protocols = Use only TCP
Observação: Em alguns ambientes, isso não resolveu sozinho, mas reduziu a frequência das quedas. Use como paliativo até aplicar a correção por atualização.
Sem GPO? Configure via Registro no cliente
New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client' -Force | Out-Null
New-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client' `
-Name 'fClientDisableUDP' -PropertyType DWord -Value 1 -Force
Workaround operacional
- Console temporário: abrir uma sessão de console (Hyper‑V) com credenciais administrativas pode “ressuscitar” momentaneamente o serviço RDS/RemoteApp até a próxima janela de reinício.
- Reboots controlados: programe reinicializações fora do horário de pico; se o host “travar” no desligamento, aguarde a conclusão do clean shutdown antes de forçar o power off pelo Hyper‑V.
Diagnóstico complementar (quando o KB não está presente ou os sintomas persistem)
Se o KB5041578 não estiver instalado e as desconexões continuarem, investigue além do RDS.
- Confirme o código: 3489660929 =
0xD0000001
(genérico). Correlacione horários com instalações de updates, falhas em drivers e picos de latência. - Rede e drivers: atualize drivers de NIC/WLAN do host, verifique o Device Manager, e procure erros em Event Viewer → System.
- Capturas: quando viável, use Wireshark ou:
netsh trace start capture=yes scenario=NetConnection reproduza o problema netsh trace stop analise o ETL gerado
- Camada de segurança: valide se há inspeção/filtragem de UDP em firewalls, SD‑WAN, VPN e dispositivos de borda. Em um caso de teste, desabilitar tráfico site‑to‑site não alterou o comportamento—mas revise sua própria rota de dados.
- Registros adicionais: monitore também RemoteConnectionManager e, se habilitado, os logs do provedor RdpCoreTS.
Fluxo de decisão prático
- Coletar evidências (Event ID 40, razão 3489660929, horário, escopo—um host ou vários).
- Verificar o KB5041578 no(s) host(s) afetado(s).
- Se presente: remover KB → reiniciar → validar → aplicar cumulativa mais recente que contenha a correção.
- Se ausente ou persistente: forçar TCP por GPO + revisar rede/driver + capturar tráfego → corrigir achados → validar estabilidade.
- Fechar mudança: documentar, impedir reinstalação involuntária, reativar políticas padrão.
Procedimentos e comandos úteis reunidos
Listar últimas atualizações
Get-HotFix | Sort-Object InstalledOn -Descending |
Select-Object -First 20 Source,HotFixID,InstalledOn
Checar rapidamente desconexões (Event ID 40)
Get-WinEvent -LogName 'Microsoft-Windows-TerminalServices-LocalSessionManager/Operational' |
Where-Object {$_.Id -eq 40} |
Select-Object TimeCreated, Message | Format-List
Desabilitar UDP no cliente via Registro (se não usar GPO)
New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client' -Force | Out-Null
New-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client' `
-Name 'fClientDisableUDP' -PropertyType DWord -Value 1 -Force
Forçar TCP no servidor via GPO
Administrative Templates → Windows Components → Remote Desktop Session Host → Select RDP transport protocols = Use only TCP
Automatização para múltiplos hosts
Se você administra uma fazenda RDS com vários Session Hosts, use o script abaixo para inventariar e corrigir em lote. Ajuste a lista de servidores e teste em um piloto antes do amplo uso.
$servers = @(
"RDSH01","RDSH02","RDSH03" # substitua pelos seus hosts
)
\$results = foreach (\$svr in \$servers) {
try {
\$kb = Invoke-Command -ComputerName \$svr -ScriptBlock { Get-HotFix -Id KB5041578 -ErrorAction SilentlyContinue }
\[pscustomobject]@{
Server = \$svr
KB5041578 = if (\$kb) { "Presente" } else { "Ausente" }
InstalledOn = if (\$kb) { \$kb.InstalledOn } else { \$null }
}
} catch {
\[pscustomobject]@{
Server = \$svr
KB5041578 = "Erro de consulta"
InstalledOn = \$null
}
}
}
\$results | Format-Table -AutoSize
Desinstalar onde necessário (janela de manutenção!)
\$targets = \$results | Where-Object { $\_.KB5041578 -eq "Presente" } | Select-Object -ExpandProperty Server
foreach (\$t in \$targets) {
Write-Host "Removendo KB5041578 de \$t..."
Invoke-Command -ComputerName \$t -ScriptBlock {
Start-Process "wusa.exe" -ArgumentList "/uninstall /kb:5041578 /quiet /norestart" -Wait
}
Write-Host "Agende o reboot de \$t."
}
Boas práticas de GPO e validação
- Separar GPOs por função (Clientes vs. Session Hosts) e usar WMI filters quando necessário.
- Propagação: após aplicar GPOs, force atualização e audite:
gpupdate /force gpresult /r /scope computer
- Documentação: registre número do chamado, janela de mudança, versões dos KBs e evidências (prints dos eventos 40 antes/depois).
Checklist de validação pós-correção
- Sem novos Event ID 40 com reason 3489660929 após períodos equivalentes aos de falha.
- Conexões RDP/RemoteApp estáveis em horário de pico e sob carga.
- Usuários sem relatos de “congelamento” ou “kicks” simultâneos.
- Cumulativa mais recente aplicada e WSUS/WUfB configurado para evitar reinstalação do KB problemático.
- GPOs revisadas: manter ou remover a mitigação de “TCP only” conforme resultado dos testes (restaurar UDP melhora experiência).
FAQ rápida
Isso afeta todos os hosts de uma fazenda? Em muitos relatos, o comportamento aparecia “por host”. Verifique cada Session Host individualmente (o Connection Broker e o Gateway tendem a exibir sintomas diferentes quando são a causa primária).
Forçar TCP degrada a experiência? Pode aumentar a latência percebida e reduzir a suavidade de áudio/vídeo, pois o RDP via UDP otimiza perda e jitter. Trate como mitigação temporária.
Posso apenas remover o KB e ficar sem cumulativas? Não é recomendado por postura de segurança. Após estabilizar, aplique uma cumulativa mais recente que contenha a correção, e mantenha a cadência normal de atualizações.
Como diferenciar falha de rede de bug de atualização? A correlação temporal é a pista principal: quedas iniciadas após instalar certa cumulativa, revertendo ao remover; capturas de tráfego sem perda relevante; logs sem eventos de link flapping.
Resumo executivo
- O sintoma “Event ID 40, reason 3489660929 / 0xD0000001” afetou múltiplos ambientes no Windows Server 2019.
- Remover o KB5041578 resolveu de forma consistente nos casos reportados; depois, instalar a cumulativa mais recente manteve a estabilidade.
- Mitigação: forçar TCP (desligar UDP) em clientes e Session Hosts via GPO ajuda a reduzir impacto até aplicar a correção por atualização.
- Se o KB não estiver presente e o problema persistir, investigue rede/drivers e a linha do tempo de outras cumulativas, incluindo inspeções em dispositivos de segurança e provedores SD‑WAN/VPN.
Apêndice: referências rápidas
Área | Detalhe |
---|---|
GPO Cliente | Windows Components → Remote Desktop Services → Remote Desktop Connection Client → Turn off UDP On Client = Enabled |
GPO Servidor | Windows Components → Remote Desktop Session Host → Select RDP transport protocols = Use only TCP |
Logs RDS | TerminalServices‑LocalSessionManager/Operational e RemoteConnectionManager |
Reason code | 3489660929 = 0xD0000001 (genérico) |
Remoção do KB | wusa /uninstall /kb:5041578 /quiet /norestart ou DISM com /remove-package |
Dica final: mantenha um playbook de incidentes RDS com scripts versionados (PowerShell), padrão de logs a coletar e janelas de manutenção predefinidas. Incidentes como este tendem a reaparecer sob diferentes disfarces; processos repetíveis fazem toda a diferença.