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


Итоговый скрипт с твоими IP уже подставлен. Сохрани как **RDP-FullSetup.ps1** (UTF-8 с BOM), рядом положи **Run.bat**, запуск — от администратора, на каждой машине отдельно.

**RDP-FullSetup.ps1**

```powershell
# =====================================================================
#  RDP FULL SETUP — итоговая версия
#  1) Полностью включает/восстанавливает RDP (реестр, службы, порт)
#  2) Whitelist по IP — подключаются только эти адреса
#  3) Полностью отключает блокировку учётных записей + снимает все локи
#  Запуск ОТ АДМИНИСТРАТОРА, на каждой машине отдельно
# =====================================================================

# ------------------ НАСТРОЙКИ ------------------
$WhitelistIPs = @(
    '213.208.168.82',
    '95.215.177.110',
    '193.168.198.178',
    '113.160.224.143',
    '95.27.86.246',
    '144.124.225.143'
)
$RuleName  = 'RDP whitelist ONLY'
$EnableNLA = $true   # $false — только если есть очень старые RDP-клиенты

# ------------------ 0. ПРОВЕРКИ ------------------
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host 'ОШИБКА: запусти от администратора!' -ForegroundColor Red; pause; exit 1
}

# ------------------ 1. RDP В РЕЕСТРЕ ------------------
Write-Host '=== 1. Включаю RDP (реестр) ===' -ForegroundColor Cyan
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name 'fDenyTSConnections' -Value 0 -Type DWord
$nla = if ($EnableNLA) { 1 } else { 0 }
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'UserAuthentication' -Value $nla -Type DWord
$rdpPort = (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'PortNumber' -ErrorAction SilentlyContinue).PortNumber
if (-not $rdpPort) { $rdpPort = 3389 }
Write-Host "RDP разрешён. Локальный порт: $rdpPort, NLA=$nla"

# ------------------ 2. СЛУЖБЫ ------------------
Write-Host '=== 2. Поднимаю службы RDP ===' -ForegroundColor Cyan
foreach ($svc in 'TermService', 'SessionEnv', 'UmRdpService') {
    Set-Service -Name $svc -StartupType Automatic -ErrorAction SilentlyContinue
    Start-Service -Name $svc -ErrorAction SilentlyContinue
    Write-Host "$svc : $((Get-Service -Name $svc -ErrorAction SilentlyContinue).Status)"
}

# ------------------ 3. РАЗБЛОКИРОВКА УЧЁТОК ------------------
Write-Host '=== 3. Снимаю блокировки со всех локальных учёток ===' -ForegroundColor Cyan
Get-LocalUser | ForEach-Object {
    try {
        $u = [ADSI]("WinNT://$env:COMPUTERNAME/$($_.Name),user")
        if ($u.IsAccountLocked) {
            $u.IsAccountLocked = $false
            $u.SetInfo()
            Write-Host "Разблокирован: $($_.Name)" -ForegroundColor Yellow
        }
    } catch { }
}

# ------------------ 4. ОТКЛЮЧЕНИЕ БЛОКИРОВКИ ------------------
Write-Host '=== 4. Отключаю блокировку учётных записей (порог=0) ===' -ForegroundColor Cyan
net accounts /lockoutthreshold:0 | Out-Null
net accounts

# ------------------ 5. ФАЙРВОЛ / WHITELIST ------------------
Write-Host '=== 5. Настраиваю файрвол ===' -ForegroundColor Cyan
# Отключаем все активные allow-правила на порт RDP (включая встроенные)
Get-NetFirewallRule -Direction Inbound -Action Allow -Enabled True -ErrorAction SilentlyContinue |
    Where-Object { ($_ | Get-NetFirewallPortFilter).LocalPort -eq "$rdpPort" } |
    ForEach-Object { Disable-NetFirewallRule -InputObject $_; Write-Host "Отключено: $($_.DisplayName)" }
# Удаляем старые whitelist-правила, если были
Get-NetFirewallRule -DisplayName 'RDP whitelist*' -ErrorAction SilentlyContinue | Remove-NetFirewallRule -ErrorAction SilentlyContinue
# Создаём whitelist
New-NetFirewallRule -DisplayName $RuleName -Direction Inbound -Protocol TCP -LocalPort $rdpPort -Action Allow -Profile Any -RemoteAddress $WhitelistIPs | Out-Null
Write-Host "Создано '$RuleName': порт $rdpPort, IP: $($WhitelistIPs -join ', ')"

# ------------------ 6. ПРОФИЛИ ФАЙРВОЛА ------------------
Write-Host '=== 6. Файрвол включён на всех профилях ===' -ForegroundColor Cyan
Set-NetFirewallProfile -Profile Domain, Private, Public -Enabled True -DefaultInboundAction Block -ErrorAction SilentlyContinue

# ------------------ 7. КОНТРОЛЬ ------------------
Write-Host '=== 7. Контроль ===' -ForegroundColor Cyan
Get-NetTCPConnection -State Listen -LocalPort $rdpPort -ErrorAction SilentlyContinue |
    ForEach-Object { Write-Host "Слушает: $($_.LocalAddress):$($_.LocalPort)" }
Get-NetFirewallRule -DisplayName $RuleName -ErrorAction SilentlyContinue |
    Get-NetFirewallAddressFilter | ForEach-Object { Write-Host "Whitelist: $($_.RemoteAddress)" }

Write-Host 'ГОТОВО.' -ForegroundColor Green
pause
```

**Run.bat**

```bat
@echo off
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0RDP-FullSetup.ps1"
pause
```

Итог после запуска: RDP включён и слушает, службы в автозапуске, все локи сняты, порог блокировки = 0 (сообщение «учётка заблокирована» больше не появится), подключиться могут только IP из списка, всё остальное режется дефолтным block.

Единственное требование к безопасности: не расширяй whitelist лишними адресами — при пороге 0 именно whitelist остаётся единственной защитой от перебора.