#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Remote Desktop: "an internal error has occurred" -- 0x204, 0x1104, 0x3 Fix : Turn off the protocol features that fail on the far end Source: https://jbtecwiz.com/support/win-net-rdp-internal Run as : Elevated PowerShell on the target Expect : 15 minutes Risk : low Reversible : yes WHEN THIS IS THE RIGHT FIX It connects, shows black, then drops -- usually a graphics or bitmap negotiation problem. HOW TO UNDO IT Remove fClientDisableUDP to restore UDP transport. This script walks the fix one step at a time and asks before each one. Steps with no command are things you do yourself -- it prints those and waits. Run with -DryRun to print without executing. -------------------------------------------------------------------- NO WARRANTY - USE AT YOUR OWN RISK This script is provided by JbTecWiz as-is and with no warranty of any kind, express or implied. You run it entirely at your own risk. JbTecWiz accepts no liability for any loss or damage arising from its use, including but not limited to data loss, downtime, or configuration changes that turn out to be wrong for your system. You are responsible for reading this script before running it, for satisfying yourself that it suits the machine in front of you, and for having a working backup first. Some steps cannot be undone. -------------------------------------------------------------------- #> [CmdletBinding()] param( # Print every step and command without running anything. [switch]$DryRun, # Do not ask before each step. Read the script first if you use this. [switch]$Unattended ) $ErrorActionPreference = 'Stop' $script:Failed = 0 function Write-Rule { param([string]$Text) Write-Host '' Write-Host ('-' * 70) -ForegroundColor DarkGray if ($Text) { Write-Host $Text -ForegroundColor Cyan } } function Show-Prose { param([string]$Text, [string]$Colour = "Gray") if (-not $Text) { return } $words = $Text -split "\s+"; $line = " " foreach ($w in $words) { if (($line.Length + $w.Length) -gt 74) { Write-Host $line -ForegroundColor $Colour; $line = " " } $line += "$w " } if ($line.Trim()) { Write-Host $line -ForegroundColor $Colour } } function Invoke-Step { param( [int]$Number, [string]$Do, [string]$Why, [scriptblock]$Command, [switch]$Manual, [string]$Shell = "powershell" ) Write-Rule " Step $Number of 4" Show-Prose $Do "White" if ($Why) { Write-Host ""; Show-Prose $Why "DarkGray" } if ($Manual) { Write-Host '' Write-Host ' -> Do this yourself, then press Enter to carry on.' -ForegroundColor Yellow if (-not $Unattended -and -not $DryRun) { [void](Read-Host) } return } Write-Host '' foreach ($l in ($Command.ToString().Trim() -split "`n")) { Write-Host (" " + $l.Trim()) -ForegroundColor Green } Write-Host '' if ($DryRun) { Write-Host " (dry run -- not executed)" -ForegroundColor DarkGray; return } if (-not $Unattended) { $a = Read-Host " Run this step? [Y]es / [S]kip / [Q]uit" if ($a -match "^[Qq]") { Write-Host " Stopped at your request."; exit 0 } if ($a -match "^[Ss]") { Write-Host " Skipped." -ForegroundColor DarkGray; return } } try { & $Command } catch { $script:Failed++ Write-Host (" Step $Number failed: " + $_.Exception.Message) -ForegroundColor Red Show-Prose "The rest of the fix may depend on this. Read the write-up before carrying on." "Red" if (-not $Unattended) { $c = Read-Host " Carry on anyway? [y/N]" if ($c -notmatch "^[Yy]") { exit 1 } } } } Write-Rule Write-Host ' Remote Desktop: "an internal error has occurred" -- 0x204, 0x1104, 0x3' -ForegroundColor White Write-Host ' Turn off the protocol features that fail on the far end' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: low Reversible 15 minutes' Write-Host '' Show-Prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' 'DarkYellow' Write-Rule if (-not $Unattended -and -not $DryRun) { $go = Read-Host ' Ready? [y/N]' if ($go -notmatch "^[Yy]") { Write-Host " Nothing was changed."; exit 0 } } Invoke-Step -Number 1 -Do 'Read the client-side reason from the log.' -Command { Get-WinEvent -LogName 'Microsoft-Windows-TerminalServices-RDPClient/Operational' -MaxEvents 30 | Format-Table TimeCreated,Id,Message -Wrap } Invoke-Step -Number 2 -Do 'Disable UDP transport on the client, which is the usual cause of a session that connects and dies on a lossy link.' -Why 'RDP starts on TCP and upgrades to UDP for responsiveness. When UDP is partly blocked the upgrade succeeds and then stalls, which looks like a black screen rather than a network fault.' -Command { New-Item 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client' -Force | Out-Null Set-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client' -Name fClientDisableUDP -Type DWord -Value 1 } Invoke-Step -Number 3 -Do 'On the target, restart the service outside working hours -- it disconnects everyone.' -Command { Restart-Service TermService -Force } Invoke-Step -Number 4 -Do 'If the target is a VM with a GPU-accelerated encoder, disable hardware encoding for RemoteFX in Group Policy under Remote Session Environment.' -Manual Write-Rule " Confirm it worked" Show-Prose 'A full session opens and stays up for several minutes with a screen refresh.' 'White' Write-Rule if ($script:Failed -gt 0) { Write-Host (" Finished with " + $script:Failed + " failed step(s).") -ForegroundColor Yellow Show-Prose 'Read the full write-up at https://jbtecwiz.com/support/win-net-rdp-internal' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: Remove fClientDisableUDP to restore UDP transport.' 'DarkGray' Write-Rule