Загрузка данных


$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 не слушает. Нужна дополнительная диагностика."
}