Клиент 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-архив со скриптами установки.
Главный цикл патч-службы (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) |
| 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.
Установка обновлений 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 — полезно для диагностики.
Конфигурации (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 политик, не выдаются пакеты component=config и не принимаются запросы агента. Если служба конфигураций не получает прогонов — проверьте, что флаг включён.
Дистрибутивы ПО (.exe/.msi)¶
| Режим | Что делает |
|---|---|
apply |
Скачивает файлы дистрибутива → dest_path\rel_path → выполняет install_command через cmd.exe /c (один раз на link) |
check |
Задача-заглушка «would install» |
Код 3010 (требуется перезагрузка) трактуется как успех с требованием ребута.
Установка¶
MSI (рекомендуется)¶
# Установка с указанием сервера
msiexec /i lsus-agent-net-<версия>.msi /qn /norestart SERVERURL="https://lsus.example.com:8443"
# Или через Install-LsusAgent.ps1 (для ZIP)
.\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;
2. копирует бинарники в %ProgramFiles%\LSUS\LsusAgent\;
3. создаёт %ProgramData%\LSUS\ (конфиг, логи, токен);
4. создаёт службу LsusAgent (тип «Автоматически», recovery — 3 рестарта через 60 с);
5. запускает службу.
Автоопределение сервера
Если не задать -ServerUrl и -DiscoveryDomain, скрипт определит DNS-домен хоста (через AD, WMI или $env:USERDNSDOMAIN) и будет использовать DNS SRV.
Пути установки¶
| Путь | Содержимое |
|---|---|
%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 |
Служба конфигураций и токен
Служба конфигураций использует общий lsus-client.conf (адрес сервера) и читает api-token патч-службы — отдельная регистрация и собственный токен ей не нужны.
Удаление¶
.\Uninstall-LsusAgent.ps1 # сохраняет %ProgramData%\LSUS (токен, логи)
.\Uninstall-LsusAgent.ps1 -Purge # удаляет полностью
Конфигурация¶
Файл: %ProgramData%\LSUS\lsus-client.conf (INI-формат, не JSON).
[server]
ServerUrl = https://lsus.example.com:8443
ServerDiscoveryDomain =
HeartbeatIntervalSeconds = 120
verify_ssl = false
[system]
DataDir =
scan_timeout_minutes = 30
wusa_timeout_minutes = 60
Ключи¶
| Секция | Ключ | По умолчанию | Назначение |
|---|---|---|---|
[server] |
ServerUrl / server_url |
— | URL LSUS-сервера |
[server] |
ServerDiscoveryDomain |
— | Домен для DNS SRV _lsus._tcp.<domain> |
[server] |
HeartbeatIntervalSeconds |
120 |
Интервал heartbeat, сек |
[server] |
verify_ssl |
false |
Проверка TLS-сертификата |
[system] |
scan_timeout_minutes |
30 |
Дедлайн offline-скана wsusscn2 |
[system] |
wusa_timeout_minutes |
60 |
Дедлайн одного wusa.exe |
Env-переопределения: LSUS_SCAN_TIMEOUT_MIN, LSUS_WUSA_TIMEOUT_MIN.
Приоритет источников адреса сервера¶
ServerUrlиз конфига;ServerDiscoveryDomain→ DNS SRV (перекрываетServerUrlв памяти);- если домен пуст, но хост в AD — домен из
Domain.GetComputerDomain(); assigned_server_urlс сервера (может меняться «на лету» через heartbeat).
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).
Установленные 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¶
Минимальный, у обоих исполняемых файлов:
LsusAgent.exe --version # версия патч-службы
LsusAgent.exe --console # запуск патч-службы в консоли (отладка)
LsusConfigAgent.exe --version # версия службы конфигураций
LsusConfigAgent.exe --console # запуск службы конфигураций в консоли
Подкоманд status/register/discover нет — регистрация, heartbeat и команды выполняются автоматически в главном цикле службы.
Сбор диагностики (команда с сервера)¶
Команда kind=COLLECT_DIAGNOSTICS собирает ZIP с логами LSUS, WindowsUpdateLogs, %WINDIR%\Logs\CBS, %WINDIR%\Logs\DISM, EventLog System/Application и загружает на сервер.
Команды сервера и перезагрузка¶
Поддерживаемые команды¶
| Команда | Назначение |
|---|---|
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 с логами |
`[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 по команде сервера.
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 без ручной установки.
Сервер различает пакеты по component (patch / config), что позволяет обновлять службы независимо. Самообновление службы конфигураций выполняется аналогично, по пакетам component=config (требует включённого модуля «Конфигурации»).
Связанные страницы¶
- Клиент LSUS — Linux-агент (heartbeat, обновления).
- Конфигурации — серверная часть: PowerShell-скрипты, дистрибутивы ПО.
- lsus-config-agent — Linux-аналог для Конфигураций (Ansible).
- Windows KB — управление обновлениями KB на стороне сервера.
- Полные инструкции по установке:
docs/install.mdв комплекте поставки агента.