Загрузка данных
Итоговый скрипт с твоими 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 остаётся единственной защитой от перебора.