Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

[![Platform](https://img.shields.io/badge/platform-Windows%2010%2F11-blue?logo=windows)](https://www.microsoft.com/windows)
[![.NET](https://img.shields.io/badge/.NET-8.0-purple?logo=dotnet)](https://dotnet.microsoft.com/)
[![Release](https://img.shields.io/badge/version-2.2.0-green)](https://github.com/OneDeadMachine/W-Fix/releases)
[![Release](https://img.shields.io/badge/version-3.0.0--beta.1-blue)](https://github.com/OneDeadMachine/W-Fix/releases)
[![License](https://img.shields.io/badge/license-MIT-orange)](LICENSE)
[![Author](https://img.shields.io/badge/author-OneDeadMachine-red)](https://github.com/OneDeadMachine)

Expand Down Expand Up @@ -44,6 +44,10 @@
| 12 | **Принтер по умолчанию** | Default printer | Сброс реестра + `SetDefaultPrinter` |

### Плюс:
- 🌐 **Remote Repair Center v3** — несколько доменных ПК, preflight, инвентаризация, автоматический план, проверка и изолированный rollback
- 🧠 **Диагностические правила** — вывод по наблюдаемым фактам, уверенность и официальный источник известной проблемы
- 🔐 **Credential Manager** — альтернативная доменная учётная запись без пароля в конфигурации, CLI или логах
- 📊 **Отчёты** — JSON/HTML для каждого запуска и обезличенный ZIP support bundle
- 🌐 **Удалённые машины** — системные шаги через WinRM, а пользовательские настройки принтера — в реальном интерактивном сеансе
- 🔍 **Обнаружение принтеров** — CIM / WMI / Get-Printer (тройной fallback)
- 📋 **Полный лог** — каждый шаг фиксера отображается в реальном времени
Expand All @@ -59,6 +63,13 @@
3. Выбери принтер в левой панели
4. Выбери фиксер в правой панели → нажми **«Применить»**

Для нескольких компьютеров открой **Remote Center**:

1. Добавь имена вручную либо через поиск Active Directory.
2. Выполни **Preflight** — ping носит справочный характер, рабочее подключение определяется по WinRM.
3. Запусти **Диагностику**, проверь факты и сформированный план.
4. Подтверди пакетный ремонт. Сбой одной машины не останавливает остальные; обратимые шаги неуспешной цели откатываются.

> ⚠️ Права администратора обязательны — фиксеры изменяют реестр и службы Windows.

---
Expand Down Expand Up @@ -96,6 +107,11 @@ dotnet publish src/W-Fix.App/W-Fix.App.csproj `
W-Fix/
├── src/
│ ├── W-Fix.Core/ # Бизнес-логика
│ │ ├── Abstractions/ # Контракты сессии, диагностики, ремонта и отчётов
│ │ ├── Remote/ # WinRM preflight и инвентаризация
│ │ ├── Diagnostics/ # Evidence-based правила
│ │ ├── Repair/ # Планировщик, legacy-адаптер и batch executor
│ │ ├── Catalog/ # Подписанный каталог Windows known issues
│ │ ├── Fixers/ # 12 фиксеров (FixerBase → IFixer)
│ │ ├── Services/
│ │ │ ├── WmiService.cs # Обнаружение принтеров (CIM/WMI/PS)
Expand All @@ -106,6 +122,7 @@ W-Fix/
│ │ └── Models/ # PrinterInfo, FixResult, LogEntry ...
│ └── W-Fix.App/ # WPF UI (MVVM + CommunityToolkit)
│ ├── ViewModels/
│ ├── RemoteCenterWindow.xaml
│ ├── Views/
│ └── Assets/icon.ico
└── publish/W-Fix.exe # Готовый портативный файл
Expand All @@ -116,6 +133,9 @@ W-Fix/
Подробности внутренних границ, выполнения PowerShell и правил для фиксеров:
[docs/architecture.md](docs/architecture.md).

Работа с новым центром: [docs/remote-center.md](docs/remote-center.md). Формат и подпись базы проблем:
[docs/known-issues-catalog.md](docs/known-issues-catalog.md).

---

## 📋 Системные требования
Expand Down
25 changes: 25 additions & 0 deletions docs/architecture.en.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# W-Fix v3 architecture

W-Fix v3 separates presentation, remote transport, inventory, diagnosis, planning, execution, verification,
rollback, and reporting. `App.xaml.cs` is the WPF composition root; view models receive dependencies instead of
constructing WMI, Active Directory, backup, or repair services.

The Remote Center pipeline is:

1. Normalize manual or Active Directory computers into `TargetDescriptor` values.
2. Run capability-based preflight over WinRM. Ping is informational and never decides reachability.
3. Capture OS/build/KB, queues, jobs, ports, drivers, policies, Protected Print Mode, and PrintService events.
4. Produce evidence-backed `DiagnosticFinding` values and a capability-filtered `RepairPlan`.
5. Create targeted checkpoints, execute with bounded concurrency, verify through a fresh inventory, and roll back
only the failed target.
6. Persist a JSON/HTML run report and optionally export an anonymized support bundle.

The twelve v2 fixers remain available through `LegacyFixerRepairAction`. This compatibility boundary preserves
working repair scripts while orchestration moves to `IRepairAction`, `IRepairPlanner`, and `IRepairExecutor`.

Alternate domain credentials are stored only in Windows Credential Manager. The password is materialized for a
short-lived `PSCredential`; it is never embedded in a PowerShell script, process arguments, configuration, or logs.

The known-issues catalog is declarative. A valid ECDSA signature does not grant code execution: catalog entries can
only reference action IDs compiled into W-Fix. Microsoft source URLs are restricted to `learn.microsoft.com` and
`support.microsoft.com`.
34 changes: 30 additions & 4 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@
- `W-Fix.Core.Models` — данные принтеров, журнал и типизированные результаты операций.
- `W-Fix.Core.Services` — обнаружение принтеров, Active Directory и выполнение PowerShell.
- `W-Fix.Core.Fixers` — прикладные сценарии диагностики и исправления.
- `W-Fix.Core.Abstractions` — стабильные контракты транспорта, инвентаризации, диагностики, ремонта и отчётов.
- `W-Fix.Core.Remote` — WinRM/WSMan-сессии, capability preflight и снимок печатной подсистемы.
- `W-Fix.Core.Diagnostics` — правила, формирующие находки только из наблюдаемых фактов.
- `W-Fix.Core.Repair` — планирование, адаптер двенадцати v2-фиксеров и ограниченное пакетное выполнение.
- `W-Fix.Core.Catalog` — встроенный и подписанный онлайн-каталог известных проблем Windows.

UI не должен самостоятельно определять успешность системной команды. Источником истины является
`PowerShellExecutionResult`, а итог многошагового фиксера вычисляется из результатов всех выполненных шагов.
Expand Down Expand Up @@ -71,8 +76,29 @@ PowerShell Remoting выполняет команды в сервисном ко
уже вошедшего пользователя. Если интерактивного сеанса нет, операция завершается явной ошибкой — W-Fix не
сообщает ложный успех для HKCU администратора.

## Следующий архитектурный этап
## Конвейер Remote Center v3

Вынести создание сервисов из `MainWindowViewModel` в composition root и ввести интерфейсы исполнителя,
обнаружения принтеров и диалогов. Это позволит тестировать фиксеры без реального изменения Windows и добавить
интеграционные проверки снимка/отката на изолированной тестовой машине.
`App.xaml.cs` является composition root. ViewModel больше не создают системные сервисы самостоятельно.
Пользовательский поток имеет фиксированные границы:

1. `TargetDescriptor` создаётся из ручного списка либо объекта Active Directory.
2. `IRemotePreflightService` проверяет DNS, WinRM, административный токен, CIM, Spooler, Task Scheduler,
интерактивного пользователя, pending reboot и место на системном диске. Ping остаётся справочным сигналом.
3. `IPrinterInventoryService` собирает ОС/build/UBR, KB, очереди, задания, порты, драйверы, политики,
Protected Print Mode и свежие ошибки PrintService.
4. `IDiagnosticRule` создаёт `DiagnosticFinding` с доказательствами, уверенностью и локальными action ID.
5. `IRepairPlanner` исключает действия, для которых цель не имеет требуемых capabilities.
6. `IRepairExecutor` ограничивает параллелизм, создаёт снимок до мутации, выполняет шаг, повторно диагностирует
цель и при неуспехе откатывает её независимо от остальных машин.
7. `IRunReportService` сохраняет JSON/HTML в `%ProgramData%\W-Fix\Runs\<RunId>`.

Каталог известных проблем декларативен и не содержит скриптов. Даже корректно подписанная запись может выбрать
только действие, уже скомпилированное и зарегистрированное в W-Fix.

## Риски и подтверждения

- `Reversible` — обычное подтверждение плана и обязательный снимок.
- `Disruptive` — заметная маркировка (например, временная остановка Spooler).
- `Irreversible` — дополнительный диалог; сюда относятся удаление заданий или пакетов драйверов.
- Protected Print Mode не переключается автоматически: режим может удалить несовместимые очереди и драйверы.
- Удаление Windows Update не является обычным действием; допускается только отдельным экспертным сценарием.
35 changes: 35 additions & 0 deletions docs/known-issues-catalog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Known issues catalog / Каталог известных проблем

## Русский

W-Fix содержит fallback-каталог `Catalog/known-issues.json` и пытается получить два release asset:

- `known-issues.json`;
- `known-issues.json.sig` — Base64 ECDSA P-256/SHA-256 подпись точных байтов JSON.

Онлайн-файл принимается только при корректной подписи, поддерживаемой схеме, непросроченном `expiresAt`, уникальных
ID и HTTPS-ссылках на `learn.microsoft.com` либо `support.microsoft.com`. При ошибке используется последний валидный
подписанный кэш, затем встроенный fallback. Каталог не содержит PowerShell: `recommendedActionIds` может ссылаться
только на встроенные `legacy:*` действия.

Подпись выпуска:

```powershell
dotnet run --project tools/W-Fix.CatalogSigner -- sign `
src/W-Fix.Core/Catalog/known-issues.json `
path/to/known-issues-private.pem `
artifacts/known-issues.json.sig
```

Закрытый ключ нельзя добавлять в Git. Публичный ключ находится в `known-issues-public.pem` и закреплён в приложении.
При ротации ключа сначала выпускается версия W-Fix с новым публичным ключом.

## English

W-Fix accepts a remote known-issues catalog only when its detached ECDSA P-256/SHA-256 signature is valid, the schema
is supported, the document is not expired, IDs are unique, and every source is an approved Microsoft HTTPS host.
Failure falls back to the last valid signed cache and then to the embedded catalog.

Catalog content is declarative and cannot deliver scripts or commands. It can only select `legacy:*` repair actions
already compiled into W-Fix. Never commit the private signing key; rotate the embedded public key through an application
release before signing the feed with a new key.
36 changes: 36 additions & 0 deletions docs/remote-center.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Remote Repair Center / Центр удалённого ремонта

## Русский

### Требования

- доменные Windows 10/11 x64;
- административная учётная запись;
- WinRM/PowerShell Remoting;
- Task Scheduler и вошедший пользователь — только для HKCU/принтера по умолчанию;
- запуск W-Fix от имени администратора.

### Рабочий процесс

1. Откройте **Remote Center** из главного окна.
2. Добавьте FQDN/NetBIOS вручную или найдите машины в Active Directory.
3. По умолчанию используется текущая Windows-учётка и Kerberos. Альтернативную доменную учётку можно явно
сохранить в Credential Manager; пароль сразу очищается из формы.
4. Нажмите **Preflight**. Недоступная capability отключает только зависящие от неё действия.
5. Нажмите **Диагностика** и изучите факты, уверенность и план.
6. Нажмите **Ремонт**. Обычный план требует одного подтверждения; необратимые шаги — дополнительного.
7. Откройте HTML/JSON-отчёт либо экспортируйте обезличенный ZIP.

Параллелизм ограничен диапазоном 1–10, значение по умолчанию — 3. Ошибка одной машины не останавливает пакет.
Отмена прекращает запуск новых целей и инициирует rollback незавершённой обратимой цели. Перезагрузка никогда не
отправляется автоматически: в конце используется отдельная кнопка и подтверждение.

## English

Remote Center officially targets domain-joined Windows 10/11 x64 clients. Add computers manually or through Active
Directory, run preflight, capture inventory, review evidence and the proposed repair plan, then confirm the batch.

The default authentication path is the current Windows identity with Kerberos. An alternate domain account is stored
only after an explicit action in Windows Credential Manager. Concurrency defaults to three and can be set from one to
ten. A failed target is verified and rolled back independently; it does not stop the remaining targets. Reboots always
require a separate end-of-run confirmation.
3 changes: 1 addition & 2 deletions src/W-Fix.App/App.xaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
<Application x:Class="WFix.App.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="http://schemas.modernwpf.com/2019"
StartupUri="MainWindow.xaml">
xmlns:ui="http://schemas.modernwpf.com/2019">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
Expand Down
Loading