Клиент LSUS (Windows)
На Windows работают две службы LSUS (каждая — отдельный .exe / служба Windows):
| Служба | Исполняемый | Назначение |
|---|---|---|
| Патч-служба | LsusAgent.exe (служба LsusAgent) |
heartbeat, команды, установка обновлений KB, offline-скан wsusscn2, инвентаризация, self-update |
| Служба конфигураций | LsusConfigAgent.exe (служба LsusConfigAgent) |
прогоны политик конфигурации: исполнение PowerShell/DSC-скриптов модуля Конфигурации |
Разделение повторяет архитектуру Linux, где обновлениями занимается lsus-client, а конфигурациями — отдельный пакет lsus-config-agent. Раньше на Windows обе функции были совмещены в одном LsusAgent.exe; теперь конфигурации вынесены в самостоятельную службу, что упрощает её независимое обновление и не связывает долгие прогоны скриптов с циклом обновлений.
Связь между службами
Служба конфигураций не регистрируется на сервере сама — она читает токен патч-службы (только на чтение) из %ProgramData%\LSUS\api-token и работает под тем же host_id. Если патч-служба ещё не зарегистрировалась, служба конфигураций ждёт появления токена с нарастающей задержкой (5 → 60 с) и стартует автоматически.
Обе службы — это C#/.NET-приложения (.NET Framework 4.6.2+). Для управления Linux-хостами используется другой агент. Эта страница — только про Windows.
Архитектура#
- Рантайм: .NET Framework 4.6.2+ (для Windows Server 2012 R2 / Windows 8.1 и новее).
- Формат: Windows-службы (
LsusAgentиLsusConfigAgent, тип запуска «Автоматически»). - Поставка: один MSI-пакет (обе службы) и ZIP-архив со скриптами установки. Если служба
LsusConfigAgentзарегистрирована, патч-служба не запускает второй in-process цикл конфигураций; если службы нет (например,-SkipConfigAgent) — прогонами занимается встроенный воркер внутриLsusAgent.
Главный цикл патч-службы (LsusAgent)#
Несколько параллельных процессов:
| Процесс | Что делает | Интервал |
|---|---|---|
| heartbeat | POST /clients/heartbeat (кэш пакетов, статус) |
heartbeat_interval_seconds |
| packages | Полный WU+WMI-скан, POST /clients/packages |
check_interval_minutes |
| offline-scan | wsusscn2.cab + COM-сканер compliance |
check_interval_minutes |
| commands | GET /clients/commands/pending, выполнение |
min(heartbeat, 30) ± 5 с |
| inventory | Сбор фактов (CPU/RAM/диски/NIC), delta | 60 мин |
Почему heartbeat отделён от WU-скана
COM Microsoft.Update.Session.Search может занимать до 5 минут на Server 2012 R2. Чтобы долгий скан не блокировал heartbeat, он вынесен в отдельный процесс.
Главный цикл службы конфигураций (LsusConfigAgent)#
Один воркер — pull-цикл прогонов конфигураций (полный аналог Linux lsus-config-agent):
| Что делает | Endpoint | Интервал |
|---|---|---|
| Poll прогонов | GET /clients/ansible/runs/pending |
60 с + jitter |
| Claim + spec прогона | GET /clients/ansible/runs/<id> |
— |
| Прогресс | POST .../progress |
во время выполнения |
| Результат | POST .../result |
по завершении |
| Версия агента | POST /clients/ansible/version |
при старте |
Функциональность#
Windows Update API#
Используется COM Microsoft.Update.Session:
- Поиск доступных обновлений —
Search("IsInstalled=0"). - Установка —
CreateUpdateDownloader+IUpdateInstaller.Install. - Offline-скан — регистрация scan-package-сервиса из
wsusscn2.cabчерезServiceManager.AddScanPackageService, поиск по whitelist классификаций (Security/Critical/UpdateRollups/SSU), исключая Defender/MSRT.
Работа через сайт#
Артефакты агента (MSI/ZIP), каталог сканирования wsusscn2.cab и MSU хост получает только с сайта хоста. При обязательном сайте подсети (или выключенном failover) агент не переходит на адрес из ServerUrl, даже если тот задан; на ответ сайта «повторите позже» ждёт указанный срок и докачивает файл с места обрыва. Мастер прямые запросы таких хостов отклоняет.
Установка на новую машину по WinRM — из Центра отладки: активный MSI нужной архитектуры машина скачивает по одноразовой ссылке с сайта своей подсети (вне подсетей с сайтом — с мастера) с проверкой контрольной суммы и ставит с адресом сервера в параметрах.
Установка обновлений KB (wusa.exe)#
| Тип файла | Команда |
|---|---|
.msu / .cab |
wusa.exe "<file>" /quiet /norestart |
.exe (MSRT/KB890830) |
прямой запуск с /Q или /quiet /norestart |
Дедлайн wusa — wusa_timeout_minutes (по умолчанию 60, env LSUS_WUSA_TIMEOUT_MIN).
Коды возврата wusa:
| Код | Категория | Значение |
|---|---|---|
0 |
success | Успех |
3010 |
reboot_required | Успех, требуется перезагрузка |
2359302 |
success_already_installed | Уже установлено |
0x80240017 |
not_applicable | Не применимо |
0x800F081F |
package_corrupt | Источник CBS повреждён |
Коды из категорий not_applicable/prerequisite_missing/manual_intervention не переводят весь батч в failed, а помечаются как Skipped (auto-skip) — сервер продолжает установку остальных KB.
Логи CBS при провале
При локальной проблеме wusa (prerequisite_missing/manual_intervention) агент читает tail %WINDIR%\Logs\CBS\CBS.log и логирует строки, упоминающие проблемный KB — полезно для диагностики.
Антивирус и зависшая установка
Если журнал CBS не растёт и при этом процессы обслуживания не потребляют процессор, агент останавливает wusa.exe и переводит задание в статус «замер». Частая причина — антивирус блокирует файлы обслуживания Windows. Порядок проверки, рекомендуемые исключения и таблица кодов возврата — в руководстве Антивирус и установка обновлений.
Конфигурации (PowerShell/DSC) — служба LsusConfigAgent#
Исполнение политик конфигурации выполняет отдельная служба LsusConfigAgent.exe — зеркало lsus-config-agent, но исполняет PowerShell вместо Ansible.
- Проверка Ed25519-подписи контента.
- Скачивание ассетов/дистрибутивов с sha256+Ed25519.
- Запуск:
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File <wrapper> -Mode <check|apply>. - Скрипты пишутся UTF-8 с BOM (для совместимости с PowerShell 4/5).
extra_varsчерез envLSUS_EXTRA_VARS(JSON).- Сбор артефактов из
$env:LSUS_ARTIFACTS_DIR. - Команды
[DEBUG_EXEC]из центра отладки также исполняются службой конфигураций (через/clients/ansible/commands/pending).
os_family-guard
Сервер не даст .ps1 попасть Linux-хосту (и наоборот) — через os_family в назначении. Windows получает только PowerShell-скрипты, Linux — только YAML/Ansible.
Включение модуля «Конфигурации»
Серверный флаг CONFIG_MODULE_ENABLED (в data/server_settings.env, по умолчанию 1) управляет модулем конфигураций целиком: при 0 скрывается UI политик, агенту не отдаётся пакет со службой конфигураций и не принимаются её запросы. Если служба конфигураций не получает прогонов — проверьте, что флаг включён. Включение/выключение службы на хостах — тумблером в разделе Клиент LSUS → Настройки (при наличии лицензии модуля).
Дистрибутивы ПО (.exe/.msi)#
| Режим | Что делает |
|---|---|
apply |
Скачивает файлы дистрибутива → dest_path\rel_path → выполняет install_command через cmd.exe /c (один раз на link) |
check |
Задача-заглушка «would install» |
Код 3010 (требуется перезагрузка) трактуется как успех с требованием ребута.
Установка#
Готовый MSI или ZIP, уже лежащий на Master как источник автообновления, можно скачать в Управление обновлениями → Версии агента с карточки Windows-агента или из истории — тот же файл, который получают хосты.
MSI (рекомендуется)#
Один MSI ставит обе службы (LsusAgent и LsusConfigAgent). В комплекте MSI есть publish-config/LsusConfigAgent.exe.
# Установка с указанием сервера
msiexec /i lsus-agent-net-<версия>.msi /qn /norestart SERVERURL="https://lsus.example.com:8443"
# Или только DNS-обнаружение (TXT _lsus.<домен>, запас — SRV)
msiexec /i lsus-agent-net-<версия>.msi /qn /norestart DISCOVERYDOMAIN=corp.example.com
# Или через Install-LsusAgent.ps1 (MSI/ZIP; без -SkipConfigAgent — обе службы)
.\Install-LsusAgent.ps1 -ServerUrl "https://lsus.example.com:8443"
ZIP (через PowerShell-скрипт)#
# Требует права администратора
.\Install-LsusAgent.ps1 -SourceDir .\publish -ServerUrl "https://lsus.example.com:8443"
Install-LsusAgent.ps1 автоматически:
1. останавливает службы и процессы LsusAgent.exe / LsusConfigAgent.exe;
2. копирует бинарники патч-службы в %ProgramFiles%\LSUS\LsusAgent\ и службы конфигураций в %ProgramFiles%\LSUS\LsusConfigAgent\;
3. создаёт %ProgramData%\LSUS\ (конфиг, логи, токен);
4. создаёт службы LsusAgent и LsusConfigAgent (тип «Автоматически», recovery — 3 рестарта через 60 с);
5. запускает обе службы.
-SkipConfigAgent — аварийный выключатель: не копирует и не регистрирует LsusConfigAgent.
Автоопределение сервера
Если не задать -ServerUrl и -DiscoveryDomain, скрипт определит DNS-домен хоста (через AD, WMI или $env:USERDNSDOMAIN) и будет использовать DNS TXT _lsus.<домен> (запас — SRV _lsus._tcp). Найденный домен записывается в ServerDiscoveryDomain, поэтому агент запрашивает только его. Если домен определить не удалось, ключ остаётся пустым и агент сам ищет зону по суффиксам хоста (см. режимы DNS-поиска).
Пути установки#
| Путь | Содержимое |
|---|---|
%ProgramFiles%\LSUS\LsusAgent\ |
LsusAgent.exe (патч-служба), DLL, конфиг службы |
%ProgramFiles%\LSUS\LsusConfigAgent\ |
LsusConfigAgent.exe (служба конфигураций), DLL |
%ProgramData%\LSUS\ |
lsus-client.conf, agent-state.json, client-id, host-id, api-token (патч-служба) |
%ProgramData%\LSUS\Config\ |
данные службы конфигураций: рабочие файлы прогонов, логи |
%ProgramData%\LSUS\logs\lsus-agent.log |
журналы патч-службы |
%ProgramData%\LSUS\Config\logs\lsus-config-agent.log |
журналы службы конфигураций |
%ProgramData%\LSUS\update\ |
кеш self-update |
%ProgramData%\LSUS\settings-cache.json |
последняя политика на время недоступности мастера |
%ProgramData%\LSUS\wu-cache-state.json |
состояние починки кеша Windows Update: время последней ошибки и починки, счётчик попыток, id служб offline-скана, отложенные prerequisite |
Служба конфигураций, токен и DNS
Служба конфигураций использует общий lsus-client.conf и читает api-token патч-службы — отдельная регистрация и собственный токен ей не нужны. Адрес сервера она находит так же, как патч-агент (те же режимы DNS-поиска, те же зоны и те же локальные адреса для выбора по cidr): ServerUrl в конфиге, иначе DNS TXT _lsus.<зона> (запас — SRV _lsus._tcp). Глобальный тумблер «Агент конфигураций на хостах» в «Управление обновлениями → Клиент LSUS → Настройки» останавливает или запускает службу LsusConfigAgent, не трогая патч-агент.
Удаление#
.\Uninstall-LsusAgent.ps1 # сохраняет %ProgramData%\LSUS (токен, логи)
.\Uninstall-LsusAgent.ps1 -Purge # удаляет полностью
Конфигурация#
Файл: %ProgramData%\LSUS\lsus-client.conf (INI-формат, не JSON).
[server]
ServerUrl = https://lsus.example.com:8443
ServerDiscoveryDomain =
# dns_discovery = true
HeartbeatIntervalSeconds = 120
verify_ssl = false
[system]
DataDir =
scan_timeout_minutes = 45
wusa_timeout_minutes = 60
Ключи#
| Секция | Ключ | По умолчанию | Назначение |
|---|---|---|---|
[server] |
ServerUrl / server_url |
— | URL LSUS-сервера |
[server] |
ServerDiscoveryDomain |
— | Домен для TXT _lsus.<domain> и SRV _lsus._tcp.<domain>; при заданном значении запрашивается только эта зона. Кавычки вокруг значения (их может оставить установщик MSI) агент не учитывает. |
[server] |
dns_discovery |
true |
false отключает DNS-поиск полностью (см. «Режимы DNS-поиска») |
[server] |
HeartbeatIntervalSeconds |
120 |
Интервал heartbeat, сек |
[server] |
verify_ssl |
false |
Проверка TLS-сертификата |
[system] |
scan_timeout_minutes |
45 |
Дедлайн offline-скана wsusscn2. Скан, не уложившийся в него, агент считает зависшим и чинит (см. «Копии offline-скана») |
[system] |
wusa_timeout_minutes |
60 |
Дедлайн одного wusa.exe |
[system] |
wu_cache_auto_repair |
true |
Автоматическая починка кеша Windows Update; false отключает только её (env LSUS_WU_CACHE_AUTO_REPAIR) |
Env-переопределения: LSUS_SCAN_TIMEOUT_MIN, LSUS_WUSA_TIMEOUT_MIN.
Приоритет источников адреса сервера#
assigned_server_urlс сервера (после/assignment);- DNS: TXT
_lsus.<зона>, иначе SRV_lsus._tcp.<зона>. Какие зоны запрашиваются, зависит от конфига (см. «Режимы DNS-поиска»); найденный адрес перекрываетServerUrlв памяти; ServerUrlиз конфига, если DNS ничего не вернул или поиск не запускался.
Найденный по DNS адрес хранится только в памяти службы, lsus-client.conf не меняется.
Режимы DNS-поиска#
Режим определяется конфигом, патч-служба и служба конфигураций выбирают его одинаково:
dns_discovery = false— поиск выключен полностью: ни DNS-запросов, ни повторов. РаботаетServerUrl.- Задан
ServerDiscoveryDomain— запрашивается только эта зона. Другие зоны не пробуются, чтобы закреплённый домен не подменялся догадкой. ServerDiscoveryDomainпуст,ServerUrlзадан — запрашивается только домен AD (если хост в домене). Вне AD DNS не запрашивается, адрес из конфига не подменяется.- Пусты оба ключа — поиск по зонам по порядку: домен AD, суффикс FQDN хоста, первичный DNS-суффикс, суффиксы активных сетевых адаптеров (адаптер со шлюзом по умолчанию первым). Хост вне домена находит сервер так же, как Linux-клиент: достаточно TXT
_lsus.<зона>в зоне, которую выдал DHCP или которая указана в суффиксе. Однокомпонентные зоны (corp,lan) допускаются.
В каждой зоне сначала запрашивается TXT, затем SRV (если TXT нет или его cidr не подошёл). Ответ «записей нет» ведёт к следующей зоне; ответ с ошибкой от DNS-сервера для зоны (SERVFAIL, REFUSED) тоже, но итог считается неполным; если DNS недоступен (таймаут, нет сети), проход прерывается.
Пока адреса нет, поиск повторяется: сразу после старта пауза 15 с, затем 30 с, 1 мин, 2 мин и далее раз в 5 минут. Перед каждым проходом служба перечитывает ServerUrl, ServerDiscoveryDomain и dns_discovery из lsus-client.conf: адрес, дописанный вручную или через LsusAgent.exe set-server, подхватывается без перезапуска службы. Когда адрес появился, служба один раз запрашивает назначение сайта и регистрируется.
Закрытый контур
- Если DNS не используется, задайте
ServerUrlиdns_discovery = false: служба не отправит ни одного DNS-запроса. - Недоступный DNS не мешает запуску. Один проход ограничен по времени (около 10 с при старте, около 20 с при повторах), служба конфигураций ищет сервер уже после запуска, а не до подключения к диспетчеру служб. Если
ServerUrlзадан, работа идёт с ним. - Поиск использует только локальные настройки ОС (суффиксы, адаптеры, домен AD) и ничего не запрашивает в интернете.
- В журнал пишется одна строка на проход со списком зон и итогом; тот же итог повторно записывается не чаще раза в 15 минут.
- Адрес из DNS не проверяется иначе, чем TLS (по умолчанию
verify_ssl = false). Для хостов, которые бывают вне периметра, задайтеServerUrlилиServerDiscoveryDomain: суффикс сети из DHCP в чужой сети мог бы привести к чужому серверу. Install-LsusAgent.ps1записывает автоопределённый домен вServerDiscoveryDomain. Такой хост остаётся в режиме «одна зона»; чтобы перевести его на поиск по зонам, очистите ключ.
Пока мастер недоступен, агент не уходит с сайта на основной адрес: ответы площадки об обрыве мастера не считаются отказом сайта. Последняя политика берётся из settings-cache.json. Ответ площадки «назначение неизвестно, вот мой адрес» не затирает уже сохранённое назначение.
TLS/сертификаты
По умолчанию verify_ssl=false (для самоподписанных сертификатов LSUS). При verify_ssl=true и ошибке доверия агент bootstrap-импортирует сертификат сервера в LocalMachine\Root. Для Server 2012 R2 рекомендуется TLS 1.2 (KB3140245 + SchUseStrongCrypto).
Регистрация и связь с сервером#
Тот же механизм и endpoint /api/v1/clients/*, что у Linux-агента.
- Регистрация:
POST /clients/register(без Bearer, до получения токена). В ответе:api_token,host_id,new_client_uuid. - Auth: Bearer-токен в заголовке для всех вызовов после регистрации. Сохраняется в
%ProgramData%\LSUS\api-token. - Heartbeat:
POST /clients/heartbeat— статус, версия, флагpending_reboot,boot_time, активные пользователи.
Что шлёт в heartbeat#
hostname,client_uuid,os_install_id(MachineGuid, меняется при переустановке Windows);client_version,boot_time,uptime_seconds;pending_reboot(детектор CBS/WU реестра);windows_wu_scan_compliance(готовность WUA для wsusscn2);interactive_users(активные консоль/RDP);update_in_progress(флаг на время INSTALL_KB).
Хосты за сайтом
Хост, назначенный на Site, шлёт heartbeat на Site. Сайт сам сохраняет часть полей, а остальные (перезагрузка и pending_reboot, состояние Windows Update, расписания, интерактивные пользователи, часовой пояс) хранит одним блоком и передаёт мастеру пакетом раз в минуту, когда они меняются, и не реже раза в 6 часов. Мастер применяет их тем же кодом, что и прямой heartbeat, поэтому после перезагрузки цепочки волн продолжаются, а расписание, заданное пользователем на хосте, видно на мастере и для хоста за сайтом. Обновлять сначала мастер, потом сайты: старый мастер эти данные игнорирует.
Установленные KB — отдельно
Список установленных KB отправляется не в heartbeat, а отдельным запросом POST /clients/packages (из packages-воркера).
Диагностика#
Проверка работоспособности#
# статус служб (патч-служба + служба конфигураций)
Get-Service LsusAgent, LsusConfigAgent
# лог патч-службы (последние 50 строк)
Get-Content -Tail 50 "$env:ProgramData\LSUS\logs\lsus-agent.log"
# лог службы конфигураций
Get-Content -Tail 50 "$env:ProgramData\LSUS\Config\logs\lsus-config-agent.log"
На сервере: хост появится во вкладке «Хосты», инвентарь — в «Инвентаризации», активный пользователь — в карточке хоста. Прогоны политик конфигурации — в разделе «Запуски сценариев».
Логи#
- Патч-служба:
%ProgramData%\LSUS\logs\lsus-agent.log(ротация 2 МБ × 5 копий, уровень INFO). - Служба конфигураций:
%ProgramData%\LSUS\Config\logs\lsus-config-agent.log. - Логи ZIP-updater:
%ProgramData%\LSUS\update\zip-updater-<ts>.log. - Event Viewer: не используется (только файловые логи).
CLI#
Патч-служба запускается из "%ProgramFiles%\LSUS\LsusAgent\LsusAgent.exe". Флаги --version и --console сохранены: --version печатает версию, --console запускает службу в консоли для отладки. У службы конфигураций по-прежнему только --version и --console.
Проверка и установка обновлений выполняются уже запущенной службой LsusAgent. Если служба остановлена, эти команды сообщают об ошибке. status при этом всё равно печатает адрес сервера и наличие файлов.
| Команда | Назначение | Нужен администратор |
|---|---|---|
version |
версия патч-службы (то же, что --version) |
нет |
status |
URL, токен, UUID, состояние служб LsusAgent и LsusConfigAgent. Если ServerUrl не задан, пишет «не задан в конфиге, поиск по DNS» |
нет |
test-connection |
проверка связи с сервером. При пустом ServerUrl сначала делает один проход DNS-поиска |
нет |
diagnose |
конфиг, файлы и доступность сервера; при пустом ServerUrl печатает режим DNS-поиска, зоны и результат по каждой |
нет |
register |
принудительная регистрация | да |
set-server <url> |
записать адрес сервера, сбросить назначение на Site и зарегистрироваться | да |
clear-assigned-server |
сбросить назначение на сайт | да |
reset-cert |
заново получить сертификат сервера | да |
reset-identity |
новый идентификатор хоста и регистрация | да |
full-reset |
удалить токен, обновить сертификат и зарегистрироваться | да |
check |
проверить обновления. Код 0 и когда обновления найдены | да |
updates |
показать уже найденные обновления, без новой проверки | да |
update [--yes] [--reboot] |
установить обновления. Без --yes установка не начинается |
да |
cancel |
запросить отмену. Если установки нет, это не ошибка. Идущую установку KB служба может не прервать и прямо об этом напишет | да |
log [--lines N] |
журнал патч-службы, по умолчанию 50 строк | нет |
inventory [--json] [--send] |
сводка оборудования и ПО. --send отправляет на сервер только изменившиеся секции; без изменений отправка пропускается |
--send |
snapshots |
снимки не поддерживаются: команда завершается успешно и ничего не создаёт | нет |
config get РАЗДЕЛ КЛЮЧ |
прочитать настройку. Секрет (токен, пароль) не печатается | нет |
diagnose-archive [--output КАТАЛОГ] |
собрать ZIP диагностики на диске и напечатать путь. На сервер архив сам не уходит | да |
Подтверждение установки
update без --yes в неинтерактивном запуске завершается с ошибкой и не ставит обновления. --reboot перезагружает компьютер только после успешной установки.
Типовые сценарии:
& "$env:ProgramFiles\LSUS\LsusAgent\LsusAgent.exe" test-connection
& "$env:ProgramFiles\LSUS\LsusAgent\LsusAgent.exe" set-server https://site.example.com
& "$env:ProgramFiles\LSUS\LsusAgent\LsusAgent.exe" updates
& "$env:ProgramFiles\LSUS\LsusAgent\LsusAgent.exe" update --yes
& "$env:ProgramFiles\LSUS\LsusAgent\LsusAgent.exe" log --lines 50
& "$env:ProgramFiles\LSUS\LsusAgent\LsusAgent.exe" inventory --send
& "$env:ProgramFiles\LSUS\LsusAgent\LsusAgent.exe" diagnose-archive --output $env:TEMP
LsusConfigAgent.exe --version и LsusConfigAgent.exe --console остаются командами службы конфигураций.
Сбор диагностики (команда с сервера)#
Команда kind=COLLECT_DIAGNOSTICS собирает ZIP с логами LSUS, WindowsUpdateLogs, %WINDIR%\Logs\CBS, %WINDIR%\Logs\DISM, EventLog System/Application и загружает на сервер.
Кеш Windows Update (автопочинка)#
Агент сам следит за каталогом %WINDIR%\SoftwareDistribution и чинит его от имени службы, без политики. Проверка идёт раз в 6 часов и не запускается, пока идёт установка KB, скан или установка обновлений, работает wusa.exe или обслуживание Windows, либо хост ждёт перезагрузки. Состояние уходит на сервер отдельным запросом и видно значком в строке хоста:
| Состояние | Что означает | Что делает агент |
|---|---|---|
ok |
признаков проблем нет | ничего |
bloated |
накопился мусор: старые файлы Download при размере больше 2 ГБ, EventCache, PostRebootEventCache, SLS, старые копии базы |
убирает мусор, базу не трогает |
low_disk |
offline-скан упал с ошибкой базы, но места на системном томе меньше порога скана | только убирает мусор; пересоздание базы места не добавит |
broken |
ошибка базы повторилась после очистки при достаточном месте | пересоздаёт базу |
repaired |
база пересоздана, ждём успешного скана | внеочередной offline-скан |
repair_failed |
починка не удалась: путь файла (обычно его держит антивирус), зависшая служба Windows Update или повторно зависший скан — причина в комментарии | ждёт успешного скана, новой ошибки или ручного запуска |
Как проходит починка: агент останавливает службы обновления (UsoSvc, dosvc, wuauserv, bits; служб, которых нет на этой версии Windows, например UsoSvc и dosvc на 8.1 и Server 2012 R2, он пропускает), убирает мусор, при необходимости переименовывает DataStore в DataStore.bak-<время> (служба создаёт базу заново) и возвращает службы, которые были запущены. Установленные обновления не снимаются, но история установки в журнале Windows Update пропадает; первый скан после пересоздания базы идёт дольше обычного. Размер базы сам по себе пересоздание не запускает.
Автоматическая починка выполняется не чаще раза в сутки и не более трёх раз за 7 суток; после этого состояние остаётся repair_failed до ручного запуска. Отключить только автоматическую часть можно ключом wu_cache_auto_repair = false в [system]. Ручной запуск — пункт «Починить кеш Windows Update…» в меню строки хоста; он доступен агентам, которые умеют эту команду (пункт неактивен у более старых версий). Пункт «Очистить мусор Windows Update…» (обновлённый агент) убирает копии offline-скана и прочий мусор, но базу Windows Update не пересоздаёт и историю установки не сбрасывает.
Копии offline-скана (ScanFile)#
Для каждого offline-скана Windows распаковывает wsusscn2.cab в %WINDIR%\SoftwareDistribution\ScanFile\<id> (около 700 МБ) и регистрирует службу скана «LSUS Offline Scan». Если скан закончился, агент снимает службу, и Windows удаляет каталог сама. Если скан оборвался — агент остановился или обновился посреди него, служба Windows Update остановилась во время поиска, скан не уложился в scan_timeout_minutes — служба остаётся зарегистрированной, и копия лежит на диске, в том числе после перезагрузки. Каталог Download при этом может быть почти пустым.
Обновлённый агент снимает такие службы сам, одинаково на всех версиях от Windows 8.1 / Server 2012 R2 до Windows 11 и Server 2025:
- при старте службы агента, перед каждым offline-сканом и после обрыва скана;
- службы другого имени (сканеры других программ) не трогает — в отчёте указаны их имя и объём;
- каталог без службы старше суток удаляет сам, останавливая для этого только
wuauserv.
Для этого службы обновления не останавливаются. Свободное место, которое заняли копии, возвращается до проверки места перед сканом.
Зависший скан. Если COM-поиск не уложился в scan_timeout_minutes, агент помечает его брошенным: пока он не вернулся, новый offline-скан и поиск обновлений не стартуют. Плановый скан после обрыва повторяется по интервалу расписания, поиск обновлений после 10-минутного таймаута — тоже по интервалу, а не через минуту. Поиск обновлений, брошенный по таймауту, агент ждёт до scan_timeout_minutes от его начала: долгий поиск ещё не зависание. Не вернулся за это время — та же самопочинка, что после зависшего скана, а в комментарии сказано, что завис поиск. Любая остановка службы Windows Update при починке, в том числе автоматической, снимает брошенные вызовы, и скан после неё не ждёт их возврата. Самопочинка агента:
- перезапускает
wuauserv— это прерывает зависший поиск. Процессsvchostне завершается: на Windows 8.1 / 2012 R2, Server 2016 и машинах с малой памятью в нём работают планировщик, WMI и другие службы. ЕслиUsoSvcилиWaaSMedicSvcснова запускаютwuauserv, агент проверяет это перед каждым шагом; - снимает свои службы скана;
- через 20 минут запускает проверочный скан, если места хватает.
Итог уходит на сервер с комментарием. Скан снова прошёл — значка в строке хоста нет. Не вышло — состояние «кеш WU: не починен», первая фраза причины видна под именем хоста, полный текст — по наведению: служба Windows Update не останавливается (нужна перезагрузка), каталог или служба не снимаются (путь и причина), проверочный скан снова завис или упал, места всё равно мало. Базу Windows Update из-за зависания агент не пересоздаёт. Ограничения автопочинки (раз в сутки, три раза за 7 суток) действуют и здесь.
Чем отличаются версии Windows
- Windows 8.1 / Server 2012 R2. Служб
UsoSvc,dosvcиWaaSMedicSvcнет. Перед сканом агент ставит prerequisite (KB3173424, KB3138615, KB3172614, KB4566425). Еслиwusaдля prerequisite остановлен по таймауту или вернул0x652(«уже идёт другая установка»), следующая попытка — через сутки или после перезагрузки, а не перед каждым сканом; в комментарии самопочинки указано, какой KB не встал и почему. Журнал Windows Update — текстовый%WINDIR%\WindowsUpdate.log. - Server 2016 и Windows 10 1607. Есть
UsoSvc, нетWaaSMedicSvc. Скан по большому cab идёт долго — поэтомуscan_timeout_minutesпо умолчанию 45. - Windows 10 1703+ и 11, Server 2019–2025.
UsoSvcиWaaSMedicSvcмогут снова запуститьwuauserv;dosvcна клиентских версиях работает постоянно. Отказ остановкиUsoSvcилиdosvcне отменяет уборку копий скана. Журнал Windows Update — файлы.etlв%WINDIR%\Logs\WindowsUpdate, текст из них даётGet-WindowsUpdateLog.
В архив диагностики (COLLECT_DIAGNOSTICS) входят windows_update/software_distribution.txt с размерами каталогов SoftwareDistribution, каждой копией ScanFile и списком служб Windows Update, а также ReportingEvents.log; на 8.1 / 2012 R2 — WindowsUpdate.log, на 10+ — свежие .etl в пределах бюджета.
Права и языки Windows
Права на заблокированный файл агент меняет по идентификаторам SID (S-1-5-18, S-1-5-32-544), поэтому починка не зависит от языка Windows. «Очистка диска» из шаблона «Windows: обслуживание» кеш не чинит и не заменяет автопочинку; не назначайте её на то же окно.
Команды сервера и перезагрузка#
Поддерживаемые команды#
| Команда | Назначение |
|---|---|
INSTALL_KB |
Установка списка KB (через wusa.exe/.exe) |
SCAN_NOW |
Offline-скан wsusscn2 |
REBOOT_NOW |
Перезагрузка хоста (shutdown /r /t 60) |
REQUEST_STATUS |
Немедленный heartbeat |
UPDATE_AGENT |
Self-update (скачивание + установка MSI/ZIP) |
COLLECT_DIAGNOSTICS |
Сбор ZIP с логами |
WU_CACHE_REPAIR |
Починка кеша Windows Update (та же процедура, что и автоматическая, без ограничений по расписанию). С "action":"cleanup" (обновлённый агент) — только мусор и копии offline-скана, база не пересоздаётся |
`[FIX_BROKEN]` не реализован
Команда [FIX_BROKEN] сразу помечается как failed — handler не реализован в Windows-агенте.
Перезагрузка#
- REBOOT_NOW —
shutdown.exe /r /t 60(окно 60 секунд для пользователя). Агент отправляетcompletedДО начала перезагрузки; сервер переводит батч вwaiting_rebootи ждёт сменыboot_timeв следующем heartbeat. - Авто-reboot при INSTALL_KB — если wusa вернул
3010или системныйPendingRebootDetectorсработал, агент сообщаетreboot_required=true; сервер решает, инициировать ли перезагрузку (в auto_continue-режиме). - Агент не ждёт ребут сам — только сообщает потребность или исполняет REBOOT_NOW по команде сервера.
- REBOOT_NOW не прерывает установку: пока идёт
INSTALL_KB/UNINSTALL_KB, команда перезагрузки откладывается (остаётся pending) и забирается следующим опросом после завершения установки. - Отмена чужого таймерного ребута: если на хосте запланирован
shutdown /r /t N, а у агента ещё идёт установка KB, агент раз в 2 секунды отменяет таймер системным API, чтобы установка успела завершиться. Перезагрузка через меню «Пуск» (ExitWindowsEx) этим API не отменяется — в этом случае агент дозавершает остановку службы с предупреждением в журнале.
Self-update#
Команда [UPDATE_AGENT] запускает обновление патч-службы LsusAgent:
GET /clients/agent-package?os=windows&architecture=<arch>&package_type=zip&component=patch(fallback наmsi);- скачивание в
%ProgramData%\LSUS\update\<sha8>-<filename>с проверкой sha256; на слабом канале агент докачивает файл по Range, а сайт отдаёт уже скачанный пакет из своего кэша; - ZIP →
Update-FromZip.ps1(backup → распаковка → overlay → restart); если PowerShell не стартовал (нет в PATH) — агент ставит MSI. MSI →msiexec /i ... /qn /norestartиз%SystemRoot%\System32; - после рестарта службы агент сверяет версию с маркером и отчитывается: success/failed.
Для уже установленных агентов старше 1.0.94 сервер сам отдаёт MSI вместо ZIP, чтобы обойти сломанный PATH без ручной установки.
Оба компонента поставляются одним пакетом lsus-agent-net-<версия> (MSI или ZIP): отдельного установщика или пакета обновлений для службы конфигураций нет. Self-update по ZIP (Update-FromZip.ps1 из скачанного архива) останавливает, обновляет и запускает обе службы; MSI также регистрирует обе. Установленный ранее патч-агент при self-update получает службу конфигураций без переустановки MSI.
Связанные страницы#
- Клиент LSUS — Linux-агент (heartbeat, обновления).
- Конфигурации — серверная часть: PowerShell-скрипты, дистрибутивы ПО.
- lsus-config-agent — Linux-аналог для Конфигураций (Ansible).
- Windows KB — управление обновлениями KB на стороне сервера.
- Антивирус и установка обновлений — исключения антивируса, диагностика зависшей установки.
- Полные инструкции по установке:
docs/install.mdв комплекте поставки агента.