feat: локальные скрипты починки RDP/TLS для Windows (fix-DAK-PC)
Fix-RdpTls.ps1 с фазами диагностики, cert, ACL, привязкой; самотесты; docs repair install и возврат TLS. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
# Пошаговый runbook — за компом DAK-PC (локально)
|
||||
|
||||
Выполняйте **на проблемном ПК** в PowerShell **от имени администратора**.
|
||||
|
||||
## 0. Подготовка
|
||||
|
||||
```powershell
|
||||
# Скопируйте репозиторий, например:
|
||||
# git clone https://git.kalinamall.ru/PapaTramp/fix-DAK-PC.git C:\Tools\fix-DAK-PC
|
||||
|
||||
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
|
||||
cd C:\Tools\fix-DAK-PC\scripts
|
||||
```
|
||||
|
||||
## 1. Самотесты (обязательно)
|
||||
|
||||
```powershell
|
||||
.\Invoke-RdpRepairSelfTest.ps1 -IncludeAdminTests
|
||||
```
|
||||
|
||||
Ожидание: `FAIL=0`. При ошибках — не продолжайте.
|
||||
|
||||
## 2. Диагностика
|
||||
|
||||
```powershell
|
||||
.\Fix-RdpTls.ps1 -DiagnoseOnly
|
||||
```
|
||||
|
||||
Отчёт: `%ProgramData%\RdpRepair\report-*.txt`
|
||||
Лог: `%ProgramData%\RdpRepair\repair-*.log`
|
||||
|
||||
Сохраните отчёт на флешку / в тикет.
|
||||
|
||||
## 3. Полный автоматический ремонт TLS
|
||||
|
||||
```powershell
|
||||
.\Fix-RdpTls.ps1
|
||||
```
|
||||
|
||||
Скрипт спросит подтверждение на каждой фазе:
|
||||
|
||||
1. Очистка cert + нативный сброс
|
||||
2. Опционально **reboot** (если Windows должен сам создать cert)
|
||||
3. Создание локального cert + ACL + привязка
|
||||
4. Проверка **Hash AFTER**
|
||||
5. Предложение `SecurityLayer=2`
|
||||
|
||||
### Если после reboot (шаг 3.2)
|
||||
|
||||
Снова с консоли:
|
||||
|
||||
```powershell
|
||||
cd C:\Tools\fix-DAK-PC\scripts
|
||||
.\Invoke-RdpRepairSelfTest.ps1 -IncludeAdminTests
|
||||
.\Fix-RdpTls.ps1
|
||||
```
|
||||
|
||||
## 4. Если Hash AFTER пустой (TermService отклоняет cert)
|
||||
|
||||
### 4a. Срочный RDP (без TLS)
|
||||
|
||||
```powershell
|
||||
.\Fix-RdpTls.ps1 -EmergencyRdpOnly
|
||||
```
|
||||
|
||||
Проверьте RDP с другого ПК. На клиенте:
|
||||
|
||||
```powershell
|
||||
Remove-Item "HKCU:\Software\Microsoft\Terminal Server Client\Servers\DAK-PC" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
```
|
||||
|
||||
### 4b. Repair install Windows
|
||||
|
||||
См. [REPAIR-INSTALL.md](REPAIR-INSTALL.md) — `setup.exe` → обновление с сохранением файлов.
|
||||
|
||||
После repair:
|
||||
|
||||
```powershell
|
||||
.\Fix-RdpTls.ps1
|
||||
```
|
||||
|
||||
## 5. Возврат нормального TLS
|
||||
|
||||
**Только** когда `Hash AFTER` совпадает с thumbprint и RDP с TLS работает:
|
||||
|
||||
```powershell
|
||||
.\Fix-RdpTls.ps1 -RestoreTls
|
||||
```
|
||||
|
||||
Подробно: [RETURN-TO-TLS.md](RETURN-TO-TLS.md).
|
||||
|
||||
## 6. DISM / SFC (до или после repair)
|
||||
|
||||
```powershell
|
||||
DISM /Online /Cleanup-Image /RestoreHealth
|
||||
sfc /scannow
|
||||
```
|
||||
|
||||
Перезагрузка → снова `.\Fix-RdpTls.ps1`.
|
||||
|
||||
## Критерии «готово»
|
||||
|
||||
- [ ] `Cert store` — cert с `NotAfter` в будущем
|
||||
- [ ] `SSLCertificateSHA1Hash` после старта TermService **не пустой**
|
||||
- [ ] `SecurityLayer` = **2**
|
||||
- [ ] События 1057 / 36870 не появляются при подключении RDP
|
||||
- [ ] RDP с клиента без `-EmergencyRdpOnly`
|
||||
|
||||
## Текущее состояние DAK-PC (на момент создания репо)
|
||||
|
||||
- Работал обход: `SecurityLayer=0`
|
||||
- Перед `RestoreTls` обязательно починить привязку cert или сделать repair install
|
||||
@@ -0,0 +1,80 @@
|
||||
# Repair install Windows — когда скрипты TLS не помогают
|
||||
|
||||
## Когда нужен repair install
|
||||
|
||||
Выполняйте, если **все** условия выполнены:
|
||||
|
||||
1. `Fix-RdpTls.ps1` прошёл фазы 2–6, но **Hash AFTER** пустой после старта `TermService`.
|
||||
2. В журнале **System** событие **1057**: «не удалось **создать** самозаверяющий сертификат» / «неправильный алгоритм».
|
||||
3. `DISM /RestoreHealth` и `sfc /scannow` завершились без нарушений, но проблема осталась.
|
||||
4. Импорт cert с другого ПК (PFX) тоже сбрасывается службой.
|
||||
5. **Emergency** `SecurityLayer=0` даёт RDP, **SecurityLayer=2** — нет.
|
||||
|
||||
Это указывает на повреждение компонентов **TermService / Schannel / cert enrollment**, а не на один просроченный файл.
|
||||
|
||||
## Подготовка
|
||||
|
||||
1. Сохраните отчёты: `%ProgramData%\RdpRepair\report-*.txt`.
|
||||
2. Убедитесь в свободном месте на диске C: (**≥ 10 GB**).
|
||||
3. Имейте установочный образ **той же редакции** Win10 (19045) или Media Creation Tool.
|
||||
4. Доступ к ПК: физически или через RDP с `SecurityLayer=0` / WinRM.
|
||||
|
||||
## Порядок (на месте, сохранение файлов)
|
||||
|
||||
### 1. Скачать образ
|
||||
|
||||
- [Media Creation Tool](https://www.microsoft.com/software-download/windows10) на флешку **или**
|
||||
- ISO той же разрядности (x64), что и установленная система.
|
||||
|
||||
### 2. Запуск repair
|
||||
|
||||
1. Смонтировать ISO / вставить флешку.
|
||||
2. Запустить `setup.exe` **от администратора**.
|
||||
3. Выбрать **«Обновление»** (Upgrade) — **не** «Выборочная установка».
|
||||
4. Сохранить личные файлы и приложения.
|
||||
5. Дождаться завершения (перезагрузки).
|
||||
|
||||
### 3. После repair
|
||||
|
||||
В PowerShell **от администратора**:
|
||||
|
||||
```powershell
|
||||
cd C:\path\to\fix-DAK-PC\scripts
|
||||
.\Invoke-RdpRepairSelfTest.ps1
|
||||
.\Fix-RdpTls.ps1 -SkipEmergency
|
||||
```
|
||||
|
||||
Проверьте:
|
||||
|
||||
```powershell
|
||||
.\Fix-RdpTls.ps1 -DiagnoseOnly
|
||||
```
|
||||
|
||||
Ожидание:
|
||||
|
||||
- В store `Remote Desktop` — cert с `NotAfter` в будущем (часто нативный).
|
||||
- После фазы 6: **Hash AFTER** = thumbprint.
|
||||
- RDP с другого ПК **без** `SecurityLayer=0`.
|
||||
|
||||
### 4. Возврат TLS
|
||||
|
||||
```powershell
|
||||
.\Fix-RdpTls.ps1 -RestoreTls
|
||||
```
|
||||
|
||||
Подробнее: [RETURN-TO-TLS.md](RETURN-TO-TLS.md).
|
||||
|
||||
## DISM / SFC до repair (если ещё не делали)
|
||||
|
||||
```powershell
|
||||
DISM /Online /Cleanup-Image /RestoreHealth
|
||||
sfc /scannow
|
||||
```
|
||||
|
||||
Перезагрузка, затем снова `Fix-RdpTls.ps1`.
|
||||
|
||||
## Если repair install не помог
|
||||
|
||||
- Чистая переустановка Windows с бэкапом данных.
|
||||
- Проверка железа (диск, RAM).
|
||||
- Эскалация в Microsoft Support с логами `%ProgramData%\RdpRepair`.
|
||||
@@ -0,0 +1,71 @@
|
||||
# Возврат к нормальному TLS (SecurityLayer=2)
|
||||
|
||||
## Контекст
|
||||
|
||||
На DAK-PC временно работал RDP с **SecurityLayer=0** (шифрование RDP без TLS). На рабочих ПК домена (FVG-PC, NEW-ADMIN-PC) используется **SecurityLayer=2** (SSL/TLS) при пустом `SSLCertificateSHA1Hash` и нативном cert в store `Remote Desktop`.
|
||||
|
||||
**Не включайте SecurityLayer=2**, пока не выполнены критерии ниже.
|
||||
|
||||
## Критерии готовности
|
||||
|
||||
| Проверка | Ожидание |
|
||||
|----------|----------|
|
||||
| Cert в `LocalMachine\Remote Desktop` | есть, `NotAfter` > сегодня |
|
||||
| `SSLCertificateSHA1Hash` после старта TermService | **не пустой**, совпадает с thumbprint |
|
||||
| События 1057 за 10 мин после теста RDP | **0** |
|
||||
| Schannel 36870 | **0** |
|
||||
|
||||
Проверка одной командой (локально на DAK-PC):
|
||||
|
||||
```powershell
|
||||
cd C:\path\to\fix-DAK-PC\scripts
|
||||
.\Fix-RdpTls.ps1 -DiagnoseOnly
|
||||
```
|
||||
|
||||
## Возврат TLS
|
||||
|
||||
```powershell
|
||||
.\Fix-RdpTls.ps1 -RestoreTls
|
||||
```
|
||||
|
||||
Скрипт:
|
||||
|
||||
1. Убедится, что cert и hash на месте (или попытается привязать).
|
||||
2. Установит `SecurityLayer = 2`.
|
||||
3. Перезапустит `TermService`.
|
||||
4. Проверит hash **после** старта.
|
||||
5. Выведет инструкцию сброса кэша RDP на клиенте.
|
||||
|
||||
## На клиенте RDP (ваш ПК)
|
||||
|
||||
```powershell
|
||||
Remove-Item "HKCU:\Software\Microsoft\Terminal Server Client\Servers\DAK-PC" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
# или имя FQDN, если подключаетесь по FQDN
|
||||
Remove-Item "HKCU:\Software\Microsoft\Terminal Server Client\Servers\DAK-PC.b26.kalinamall.ru" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
```
|
||||
|
||||
Подключитесь снова по RDP.
|
||||
|
||||
## Если после RestoreTls RDP снова «внутренняя ошибка»
|
||||
|
||||
1. Срочный доступ:
|
||||
|
||||
```powershell
|
||||
.\Fix-RdpTls.ps1 -EmergencyRdpOnly
|
||||
```
|
||||
|
||||
2. Повторите **repair install** ([REPAIR-INSTALL.md](REPAIR-INSTALL.md)).
|
||||
3. Не оставляйте SecurityLayer=2 без рабочего cert.
|
||||
|
||||
## GPO
|
||||
|
||||
`LicenseServers` / `LicensingMode` в домене **не были** причиной на DAK-PC (одинаковы на всех ПК).
|
||||
Если админ меняет политики — после `gpupdate /force` снова запустите `-DiagnoseOnly`.
|
||||
|
||||
## Значения SecurityLayer (справка)
|
||||
|
||||
| Значение | Режим |
|
||||
|----------|--------|
|
||||
| 0 | Только RDP Security Layer (legacy) |
|
||||
| 1 | Negotiate |
|
||||
| 2 | SSL (TLS) — **норма для вашей сети** |
|
||||
@@ -0,0 +1,54 @@
|
||||
# Troubleshooting — RDP / TLS / сертификаты
|
||||
|
||||
## События
|
||||
|
||||
| ID | Источник | Значение |
|
||||
|----|----------|----------|
|
||||
| **1057** | RemoteConnectionManager / System | Ошибка SSL/TLS RDP; часто «неправильный алгоритм» или «не удалось создать самозаверяющий сертификат» |
|
||||
| **36870** | Schannel | `SEC_E_ALGORITHM_MISMATCH` (0x8009030d) — нет общего алгоритма с клиентом или нет валидного cert |
|
||||
| **258** | Operational | Прослушиватель RDP-Tcp запущен (норма) |
|
||||
| **261** | Operational | Входящее соединение на listener (норма) |
|
||||
|
||||
## Hash BEFORE есть, Hash AFTER пустой
|
||||
|
||||
TermService **отверг** сертификат при старте. Возможные причины:
|
||||
|
||||
- Просроченный cert (лечится заменой).
|
||||
- Нет доступа к приватному ключу → фаза ACL в `Fix-RdpTls.ps1`.
|
||||
- CNG vs CSP — скрипт пробует `RSA\MachineKeys`.
|
||||
- Повреждение Schannel → repair install.
|
||||
|
||||
## Нативный cert не создаётся после reboot
|
||||
|
||||
Store `Remote Desktop` пустой после цикла «выкл RDP → очистка → вкл RDP → reboot»:
|
||||
|
||||
- Запустите `Fix-RdpTls.ps1` фазы 4–6 локально.
|
||||
- Если не помогло — repair install.
|
||||
|
||||
## GPO Terminal Services
|
||||
|
||||
Путь: `HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services`
|
||||
|
||||
На DAK-PC и рабочих ПК может быть:
|
||||
|
||||
- `LicenseServers` = 192.168.160.150
|
||||
- `LicensingMode` = 4
|
||||
|
||||
RDP при этом работал на других ПК — **не единственная причина** отказа DAK-PC. Убирать из GPO для Win10 Pro всё равно желательно (задача админа AD).
|
||||
|
||||
Локальное удаление **откатывается** `gpupdate /force`.
|
||||
|
||||
## Клиент «внутренняя ошибка»
|
||||
|
||||
1. Сброс кэша cert на клиенте (см. RETURN-TO-TLS.md).
|
||||
2. Проверка 1057/36870 на **сервере** в момент подключения.
|
||||
3. Сравнение `SecurityLayer` с рабочим ПК.
|
||||
|
||||
## WinRM vs RDP
|
||||
|
||||
WinRM может работать при сломанном RDP TLS — это нормально. Починка RDP не требует локальной консоли, но **локальный** запуск скриптов надёжнее для cert/ACL.
|
||||
|
||||
## Логи скриптов
|
||||
|
||||
- `%ProgramData%\RdpRepair\report-*.txt` — диагностика
|
||||
- `%ProgramData%\RdpRepair\repair-*.log` — ход ремонта
|
||||
Reference in New Issue
Block a user