diff --git a/README.md b/README.md index 807007a..695f6ac 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,18 @@ Набор скриптов для **локального** (с консоли проблемного ПК) восстановления RDP, когда клиент показывает «внутренняя ошибка», в журнале **1057** / **Schannel 36870**, TermService сбрасывает `SSLCertificateSHA1Hash`. -Сценарий проверен на **DAK-PC** (Win10 Pro 19045): корень — сломанная привязка TLS-сертификата RDP; обход `SecurityLayer=0`; полное лечение — repair install + возврат TLS. +Сценарий проверен на **DAK-PC** (Win10 Pro 19045): корень — сломанная привязка TLS-сертификата RDP; обход `SecurityLayer=0`; **лечение — `Fix-RdpTls.ps1` фазы 3–5 + `-RestoreTls`** (repair install не понадобился). Подробно: [docs/DAK-PC-RESOLVED.md](docs/DAK-PC-RESOLVED.md). + +## Проверенная последовательность (DAK-PC) + +1. `.\Invoke-RdpRepairSelfTest.ps1 -IncludeAdminTests` → `FAIL=0` +2. `.\Fix-RdpTls.ps1` → при неудачном нативном сбросе: **фазы 3–5** (создать cert, ACL, привязка) +3. `.\Fix-RdpTls.ps1 -RestoreTls` → `SecurityLayer=2` +4. Сброс кэша RDP на **клиенте** + +Ранее для доступа: `.\Fix-RdpTls.ps1 -EmergencyRdpOnly` (`SecurityLayer=0`). + +**Не из репозитория:** задачи планировщика `RdpBindFix`, `RdpNativeReset`, `CryptoRepair.ps1` — отключить после успеха. ## Быстрый старт (за компом DAK-PC) @@ -41,12 +52,14 @@ powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Invoke-RdpRepairSelfTe .\Fix-RdpTls.ps1 -EmergencyRdpOnly ``` -7. После **repair install** Windows и успешной привязки cert — **возврат TLS**: +7. **Возврат TLS** (после успешной привязки cert — фазы 3–5 или нативный cert): ```powershell .\Fix-RdpTls.ps1 -RestoreTls ``` +Если Hash AFTER остаётся пустым при любом cert — см. [docs/REPAIR-INSTALL.md](docs/REPAIR-INSTALL.md). + ## Структура | Файл | Назначение | @@ -54,7 +67,8 @@ powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Invoke-RdpRepairSelfTe | `scripts/Fix-RdpTls.ps1` | Главный сценарий: диагностика → очистка → cert → привязка → проверка | | `scripts/Invoke-RdpRepairSelfTest.ps1` | Самотесты функций и синтаксиса | | `scripts/lib/RdpRepair.Common.ps1` | Общие функции | -| `docs/REPAIR-INSTALL.md` | Repair install Windows (на месте) | +| `docs/DAK-PC-RESOLVED.md` | **Фактический** сценарий успеха на DAK-PC | +| `docs/REPAIR-INSTALL.md` | Запасной план: repair install (если Hash AFTER пустой) | | `docs/RETURN-TO-TLS.md` | Возврат SecurityLayer=2 после починки cert | | `docs/TROUBLESHOOTING.md` | События, типичные ошибки, GPO | | `docs/LOCAL-RUNBOOK.md` | Пошаговый сценарий за консолью DAK-PC | diff --git a/docs/DAK-PC-RESOLVED.md b/docs/DAK-PC-RESOLVED.md new file mode 100644 index 0000000..79f78fd --- /dev/null +++ b/docs/DAK-PC-RESOLVED.md @@ -0,0 +1,92 @@ +# DAK-PC — проверенное решение (2026-06-12) + +Фактический исход: **RDP с TLS восстановлен без repair install Windows**. + +## Симптомы + +- Клиент RDP: «внутренняя ошибка» +- Журнал System: **1057**, Schannel **36870** +- `TermService` сбрасывал `SSLCertificateSHA1Hash` +- Временно работал обход `SecurityLayer=0` + +## Что **не** из этого репозитория (можно отключить на ПК) + +Создано вручную / другими скриптами во время отладки — **не запускать** после успешного ремонта: + +| Артефакт | Назначение (предположительно) | +|----------|-------------------------------| +| Задачи `RdpBindFix`, `RdpNativeReset`, `FixRdpCertSystemOnce`, `RdpLegacyCert` | Автопочинка cert/bind | +| `CryptoRepair.ps1` | ACL / crypto / cert (дублирует часть `Fix-RdpTls`) | +| `RDP-Login-Monitor` (+ Watchdog) | Мониторинг входов (по желанию) | + +## Последовательность, которая **решила** проблему + +### 1. Самотесты (после исправления багов в скриптах) + +```powershell +cd C:\Soft\fix-DAK-PC\scripts +.\Invoke-RdpRepairSelfTest.ps1 -IncludeAdminTests +``` + +Ожидание: `FAIL=0`. + +### 2. Полный ремонт — фазы 3–5 + +```powershell +.\Fix-RdpTls.ps1 +``` + +На DAK-PC: + +- **Фаза 2** (нативный сброс): cert появился, но **привязка не прижилась** → reboot не помог при повторе. +- Ответ **n** на reboot → **фаза 3–5**: + - создан cert `144D8D18C5452DBB8D3DE9FE6C61E69E2497E1A9` + - ACL на `MachineKeys` + - cert в store `Remote Desktop` + - запись `SSLCertificateSHA1Hash` (reg + WMI) + - Hash BEFORE = Hash AFTER (TermService **принял** cert) + +Скрипт тогда ошибочно показал ERROR из‑за сравнения байтов реестра с hex thumbprint (исправлено в RdpRepair **1.0.3**). + +### 3. Возврат TLS + +```powershell +git pull # версия RdpRepair 1.0.3+ +.\Fix-RdpTls.ps1 -RestoreTls +``` + +Результат в логе: + +- `Привязка cert принята TermService` +- `SecurityLayer=2, TermService перезапущен` + +### 4. На клиенте RDP (не на DAK-PC) + +```powershell +Remove-Item "HKCU:\Software\Microsoft\Terminal Server Client\Servers\DAK-PC" -Recurse -Force -ErrorAction SilentlyContinue +Remove-Item "HKCU:\Software\Microsoft\Terminal Server Client\Servers\DAK-PC.b26.kalinamall.ru" -Recurse -Force -ErrorAction SilentlyContinue +``` + +## Что **не** понадобилось на DAK-PC + +- Repair install Windows (`docs/REPAIR-INSTALL.md`) — запасной план при пустом Hash AFTER +- Повторные reboot в цикле +- Задачи планировщика `RdpBind*` / `CryptoRepair.ps1` + +## Критерии «готово» (выполнено) + +- [x] Cert в `Remote Desktop`, `NotAfter` в будущем +- [x] `SSLCertificateSHA1Hash` = thumbprint после перезапуска TermService +- [x] `SecurityLayer` = **2** +- [x] RDP с клиента работает + +## Минимальный набор файлов репозитория для повтора + +| Файл | Зачем | +|------|--------| +| `scripts/Fix-RdpTls.ps1` | Единая точка входа | +| `scripts/lib/RdpRepair.Common.ps1` | Логика cert/ACL/bind | +| `scripts/Invoke-RdpRepairSelfTest.ps1` | Проверка перед ремонтом | +| `docs/DAK-PC-RESOLVED.md` | Этот сценарий | +| `docs/TROUBLESHOOTING.md` | События 1057/36870 | +| `docs/REPAIR-INSTALL.md` | Только если Hash AFTER реально пустой | diff --git a/docs/LOCAL-RUNBOOK.md b/docs/LOCAL-RUNBOOK.md index 7ea28d7..a4ba230 100644 --- a/docs/LOCAL-RUNBOOK.md +++ b/docs/LOCAL-RUNBOOK.md @@ -1,5 +1,7 @@ # Пошаговый runbook — за компом DAK-PC (локально) +> **Фактический успех на DAK-PC (2026-06-12):** [DAK-PC-RESOLVED.md](DAK-PC-RESOLVED.md) — фазы 3–5 + `-RestoreTls`, без repair install. + Выполняйте **на проблемном ПК** в PowerShell **от имени администратора**. ## 0. Подготовка