← Назад к «Windows-клиент»

Клиент 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; теперь конфигурации вынесены в самостоятельную службу, что упрощает её независимое обновление и не связывает долгие прогоны скриптов с циклом обновлений.

infoСвязь между службами

Служба конфигураций не регистрируется на сервере сама — она читает токен патч-службы (только на чтение) из %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 мин

infoПочему 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.

lightbulbЛоги 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 через env LSUS_EXTRA_VARS (JSON).
  • Сбор артефактов из $env:LSUS_ARTIFACTS_DIR.
  • Команды [DEBUG_EXEC] из центра отладки также исполняются службой конфигураций (через /clients/ansible/commands/pending).

infoos_family-guard

Сервер не даст .ps1 попасть Linux-хосту (и наоборот) — через os_family в назначении. Windows получает только PowerShell-скрипты, Linux — только YAML/Ansible.

warningВключение модуля «Конфигурации»

Серверный флаг CONFIG_MODULE_ENABLEDdata/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. запускает службу.

lightbulbАвтоопределение сервера

Если не задать -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

infoСлужба конфигураций и токен

Служба конфигураций использует общий 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.

Приоритет источников адреса сервера

  1. ServerUrl из конфига;
  2. ServerDiscoveryDomain → DNS SRV (перекрывает ServerUrl в памяти);
  3. если домен пуст, но хост в AD — домен из Domain.GetComputerDomain();
  4. assigned_server_url с сервера (может меняться «на лету» через heartbeat).

infoTLS/сертификаты

По умолчанию 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).

infoУстановленные 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 с логами

warning`[FIX_BROKEN]` не реализован

Команда [FIX_BROKEN] сразу помечается как failed — handler не реализован в Windows-агенте.

Перезагрузка

  • REBOOT_NOWshutdown.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:

  1. GET /clients/agent-package?os=windows&architecture=<arch>&package_type=zip&component=patch (fallback на msi);
  2. скачивание в %ProgramData%\LSUS\update\<sha8>-<filename> с проверкой sha256; на слабом канале агент докачивает файл по Range, а сайт отдаёт уже скачанный пакет из своего кэша;
  3. ZIP → Update-FromZip.ps1 (backup → распаковка → overlay → restart); если PowerShell не стартовал (нет в PATH) — агент ставит MSI. MSI → msiexec /i ... /qn /norestart из %SystemRoot%\System32;
  4. после рестарта службы агент сверяет версию с маркером и отчитывается: 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 в комплекте поставки агента.