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

5.8 KiB
Raw Blame History

title, date, tags, status
title date tags status
MMFB — Effector Saver Agent не стартует, .\Администратор залочен 2026-05-28
mmfb
lionart
effector-saver
windows-service
decision
resolved

MMFB / LionART 1C — Effector Saver Agent не стартует, .\Администратор залочен

Контекст

../projects/mmfb/lionart-1c (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-пробы залочили учётку.

# Через 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

Решение (порядок важен)

# 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= "<новый>".