RDS desconecta usuários em massa (Event ID 40, reason 3489660929/0xD0000001) no Windows Server 2019: causa, correção e passo a passo

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.

Índice

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
SinalO que significaAção recomendada
KB5041578 presenteHost potencialmente afetado pelo bugRemover KB e validar; depois, atualizar para cumulativa mais recente que contenha o fix
Event ID 40 com reason 3489660929Desconexão genérica (0xD0000001)Correlacionar com instalação de updates e picos de rede; seguir o passo a passo
Sem o KB e sintomas persistemOutra 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

  1. Confirmar presença do KB: Get-HotFix -Id KB5041578
  2. Agendar janela de manutenção (para evitar impacto em horário de expediente).
  3. 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
  4. 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

  1. Coletar evidências (Event ID 40, razão 3489660929, horário, escopo—um host ou vários).
  2. Verificar o KB5041578 no(s) host(s) afetado(s).
  3. Se presente: remover KB → reiniciar → validar → aplicar cumulativa mais recente que contenha a correção.
  4. Se ausente ou persistente: forçar TCP por GPO + revisar rede/driver + capturar tráfego → corrigir achados → validar estabilidade.
  5. 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

ÁreaDetalhe
GPO ClienteWindows Components → Remote Desktop Services → Remote Desktop Connection Client → Turn off UDP On Client = Enabled
GPO ServidorWindows Components → Remote Desktop Session Host → Select RDP transport protocols = Use only TCP
Logs RDSTerminalServices‑LocalSessionManager/Operational e RemoteConnectionManager
Reason code3489660929 = 0xD0000001 (genérico)
Remoção do KBwusa /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.

Índice