$ErrorActionPreference = 'Stop'
$key = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
$backup = Join-Path $env:USERPROFILE ("RDP-backup-" + (Get-Date -Format 'yyyyMMdd-HHmmss') + '.reg')
# Сохраняем настройки перед изменениями.
& reg.exe export 'HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server' $backup /y
if ($LASTEXITCODE -ne 0) {
throw 'Не удалось создать резервную копию. Изменения отменены.'
}
New-Item -Path $key -Force | Out-Null
# Восстанавливаем только отсутствующие значения.
$defaults = @{
PortNumber = 3389
LanAdapter = 0
MinEncryptionLevel = 3
WdFlag = 54
PdClass = 2
PdFlag = 78
OutBufDelay = 100
InteractiveDelay = 50
fDisableEncryption = 0
UserAuthentication = 1
SecurityLayer = 1
WdName = 'Microsoft RDP 8.0'
WdPrefix = 'RDP'
PdDLL = 'tdtcp'
PdName = 'tcp'
LoadableProtocol_Object = '{5828227c-20cf-4408-b73f-73ab70b8849f}'
}
foreach ($name in $defaults.Keys) {
if ($null -eq (Get-ItemProperty -Path $key).PSObject.Properties[$name]) {
$type = if ($defaults[$name] -is [string]) { 'String' } else { 'DWord' }
New-ItemProperty -Path $key -Name $name `
-Value $defaults[$name] -PropertyType $type | Out-Null
}
}
New-ItemProperty -Path $key -Name fEnableWinStation `
-Value 1 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' `
-Name fDenyTSConnections -Value 0 -PropertyType DWord -Force | Out-Null
$port = (Get-ItemProperty -Path $key).PortNumber
# Разрешаем фактический порт RDP.
$ruleName = "RDP-Repair-TCP-$port"
if (Get-NetFirewallRule -Name $ruleName -ErrorAction SilentlyContinue) {
Enable-NetFirewallRule -Name $ruleName
} else {
New-NetFirewallRule -Name $ruleName -DisplayName "RDP TCP $port" `
-Direction Inbound -Action Allow -Protocol TCP `
-LocalPort $port -Profile Any | Out-Null
}
Set-Service TermService -StartupType Automatic
try {
Restart-Service TermService -Force
} catch {
Write-Warning "Перезапуск: $($_.Exception.Message). Проверяем результат..."
}
# Даём службе до минуты на запуск.
$deadline = (Get-Date).AddSeconds(60)
do {
Start-Sleep -Seconds 2
$listener = Get-NetTCPConnection -State Listen -LocalPort $port `
-ErrorAction SilentlyContinue
} until ($listener -or (Get-Date) -ge $deadline)
Write-Host "Резервная копия: $backup"
if ($listener) {
Write-Host "Порт $port слушает. Попробуйте подключиться по RDP." -ForegroundColor Green
} else {
Write-Warning "Порт $port не слушает. Нужна дополнительная диагностика."
}