Files
knowledge-base/decisions/2026-05-28-mmfb-effector-saver-locked-admin.md

80 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: MMFB — Effector Saver Agent не стартует, .\Администратор залочен
date: 2026-05-28
tags: [mmfb, lionart, effector-saver, windows-service, decision]
status: resolved
---
# MMFB / LionART 1C — Effector Saver Agent не стартует, `.\Администратор` залочен
## Контекст
[[../projects/mmfb/lionart-1c|VM 100 pve LionART]] (`WIN-70M2VEJIKEF`, 10.253.1.240, Win Server 2022). Служба `efsaveragent` (Effector Saver Agent, `C:\Program Files\Effector Saver\fagent.exe`) в Stopped/Auto, не стартует.
## Диагноз
Цепочка Event Log → SCM:
```
7038 Службе "efsaveragent" не удалось войти в систему с именем ".\Администратор"
и текущим паролем, поскольку произошла ошибка
7000 Сбой при запуске службы "Effector Saver Agent"
```
Это повторялось каждую минуту в течение последних минут. SCM хранит пароль учётки отдельно от LSA — пароль `.\Администратор` менялся (или Effector ставили со старой парой), а SCM-секрет не обновили.
Дополнительно: попытки SCM × мои WinRM-пробы залочили учётку.
```powershell
# Через LogonUser API:
LogonUser SERVICE : False (err=1909) # ERROR_ACCOUNT_LOCKED_OUT
LogonUser INTERACTIVE : False (err=1909)
LogonUser NETWORK : False (err=1909)
# Через ADSI:
$u = [ADSI]"WinNT://./Администратор,user"
$u.IsAccountLocked True
$u.BadPasswordAttempts 10
```
## Решение (порядок важен)
```powershell
# 1. Заглушить SCM, чтобы он перестал каждую минуту ломиться с неверным паролем
sc.exe config efsaveragent start= disabled
sc.exe stop efsaveragent
# 2. Разблокировать учётку (Set-LocalUser не имеет lockout-поля → через ADSI)
$u = [ADSI]"WinNT://./Администратор,user"
$u.IsAccountLocked = 0
$u.SetInfo()
# 3. Проверить пароль через LogonUser(LOGON32_LOGON_SERVICE=5) — тот же путь, что использует SCM.
# Если False — не пиши пароль в SCM, иначе сразу опять залочишь.
# Если True — пароль валидный, прошиваем:
sc.exe config efsaveragent obj= ".\Администратор" password= "<актуальный_пароль>"
sc.exe config efsaveragent start= auto
sc.exe start efsaveragent
```
После старта:
- `efsaveragent` в Running, PID 9104, fagent.exe, 28 MB
- Новых 7038/7000 — нет
- Аккаунт остаётся разлоченным
## Уроки
- При **7038** не паникуй с lockout: сначала **остановить службу** (или переключить на disabled), потом разблокировать.
- При WinRM-failed-login проверяй lockout первым делом (через `[ADSI]"WinNT://./<user>,user"` поле `IsAccountLocked`) — не подбирай пароль вслепую, иначе добиваешь счётчик.
- `Set-LocalUser` не умеет снимать lockout — только ADSI или `net user`-с-новым-паролем.
- Не доверяй `BadPasswordAttempts: 0` после разблока — этот счётчик не сразу обнуляется; смотри сам `IsAccountLocked`.
## Рецидив 2026-06-28 (та же причина, подтверждена)
Снова: `efsaveragent` Stopped/Auto, `.\Администратор` залочен (BadPwd=10). Серия 7038/7000: 25.06 15:12, 25.06 15:24, 28.06 12:14. Heartbeat в `fagent.log` оборвался 25.06 ~15:05 → **бэкапы не шли ~3 дня (25.06 → 28.06)**.
Восстановление тем же playbook (disable→stop→unlock→LogonUser(SERVICE)→pin→start). Ключевое: `LogonUser(SERVICE)` с паролем `OL260380eg` вернул **True** — то есть пароль учётки **верный**, расходился именно SCM-секрет. Значит первопричина закрыта: **пароль `.\Администратор` меняли (вероятно при настройке RDP+2FA) без обновления службы** → SCM-секрет устарел → lockout-шторм. Итог: служба Running, PID 10488.
## Постоянный фикс (ещё не применён — нужен выбор Олега)
Каждая ротация пароля `.\Администратор` будет ронять службу и локать учётку. Варианты, чтобы развязать службу с ротируемым паролем:
1. **LocalSystem** — без пароля, никогда не локается. Безопасно **только если** Effector пишет бэкап на локальный диск. Если назначение — UNC под админ-кредами, LocalSystem пойдёт на сеть как computer-account и потеряет доступ. Назначение хранилища лежит в `C:\ProgramData\Effector Saver\esdata.db` (SQLite), в `fagent.log` его нет.
2. **Выделенная учётка `.\Effector Saver`** (локальная, уже существует) с непротухающим паролем + `SeServiceLogonRight`.
Перед сменой run-as — узнать назначение бэкапа (esdata.db / fmanager UI). До тех пор: при любой смене пароля админа сразу `sc.exe config efsaveragent obj= ".\Администратор" password= "<новый>"`.