WSUS: управление обновлениями на 300 ПК в 8 магазинах

Задача клиента: контролируемые обновления в распределённой сети

Розничная сеть «ТоргСеть» обратилась к специалистам itfresh.ru с проблемой обновлений Windows. 300 рабочих станций в 8 магазинах обновлялись напрямую с серверов Microsoft. Это создавало три серьёзных проблемы.

Во-первых, канал интернета в каждом магазине — 50 Мбит/с. Когда 30-40 компьютеров одновременно скачивали обновления (иногда по 2-3 ГБ), интернет переставал работать для кассовых терминалов и ERP-системы. Магазины теряли возможность проводить продажи.

Во-вторых, отсутствовал контроль над тем, какие обновления устанавливаются. Несколько раз обновления Windows ломали драйверы фискальных регистраторов и сканеров штрих-кодов, что приводило к остановке касс на несколько часов.

В-третьих, администраторы не имели отчётности: невозможно было узнать, какие компьютеры обновлены, а какие — нет. Уязвимые машины могли работать без критических патчей месяцами.

Решение — Windows Server Update Services (WSUS): бесплатный серверный компонент Microsoft для централизованного управления обновлениями.

Архитектура: upstream и downstream серверы

Для распределённой сети «ТоргСеть» мы спроектировали двухуровневую архитектуру WSUS:

  • Upstream-сервер (центральный офис) — синхронизируется с Microsoft Update, содержит все обновления и правила одобрения.
  • Downstream-серверы (по одному в каждом магазине) — реплицируют обновления с upstream, раздают их локальным компьютерам по LAN.

Установка WSUS на центральном сервере:

# Установка роли WSUS с хранением обновлений на диске D:
Install-WindowsFeature UpdateServices -IncludeManagementTools

# Первоначальная настройка (postinstall)
& "C:\Program Files\Update Services\Tools\wsusutil.exe" postinstall `
    CONTENT_DIR=D:\WSUS_Content

# Настройка через PowerShell
$wsus = Get-WsusServer
$wsusConfig = $wsus.GetConfiguration()

# Выбираем продукты для синхронизации
$wsus.GetSubscription().GetUpdateCategories() | ForEach-Object {
    if ($_.Title -in @(
        "Windows 10, version 1903 and later",
        "Windows 11",
        "Windows Server 2022",
        "Microsoft Defender Antivirus",
        "Office 2019",
        "Microsoft 365 Apps"
    )) {
        $_.Enabled = $true
    } else {
        $_.Enabled = $false
    }
}

# Выбираем классификации обновлений
$classifications = @(
    "Critical Updates",
    "Security Updates",
    "Definition Updates",
    "Update Rollups",
    "Service Packs"
)
# Feature Packs и Drivers — исключены для контроля

# Расписание синхронизации: ежедневно в 03:00
$subscription = $wsus.GetSubscription()
$subscription.SynchronizeAutomatically = $true
$subscription.SynchronizeAutomaticallyTimeOfDay = [TimeSpan]::new(3, 0, 0)
$subscription.NumberOfSynchronizationsPerDay = 1
$subscription.Save()

# Первая синхронизация (может занять несколько часов)
$subscription.StartSynchronization()

Установка downstream-сервера в магазине:

# На сервере магазина
Install-WindowsFeature UpdateServices -IncludeManagementTools

& "C:\Program Files\Update Services\Tools\wsusutil.exe" postinstall `
    CONTENT_DIR=D:\WSUS_Content

# Настройка как replica downstream
$wsus = Get-WsusServer
$config = $wsus.GetConfiguration()
$config.SyncFromMicrosoftUpdate = $false
$config.UpstreamWsusServerName = "WSUS-HQ.torgseti.local"
$config.UpstreamWsusServerPortNumber = 8530
$config.IsReplicaServer = $true  # Реплика — наследует правила одобрения
$config.Save()

В режиме Replica downstream-сервер полностью наследует правила одобрения и группы компьютеров от upstream. Администратор управляет всем из одной консоли в центральном офисе.

Компьютерные группы и правила авто-одобрения

Компьютерные группы WSUS позволяют применять разные политики обновления к разным категориям устройств. Для «ТоргСеть» мы создали следующую структуру:

# Создание групп компьютеров
$wsus = Get-WsusServer
$wsus.CreateComputerTargetGroup("Pilot-Workstations")    # 10 ПК для тестирования
$wsus.CreateComputerTargetGroup("Cash-Registers")         # Кассовые терминалы
$wsus.CreateComputerTargetGroup("Office-Workstations")    # Офисные ПК
$wsus.CreateComputerTargetGroup("Servers")                # Серверы магазинов
$wsus.CreateComputerTargetGroup("Store-01")               # По магазинам
$wsus.CreateComputerTargetGroup("Store-02")
# ... и т.д. для всех 8 магазинов

Правила авто-одобрения — ключевой механизм WSUS. Они определяют, какие обновления устанавливаются автоматически, а какие ждут ручного одобрения.

# Правило 1: Definition Updates (антивирус) — немедленное одобрение для всех
# WSUS Console → Options → Automatic Approvals → New Rule
# When: Classification = Definition Updates
# Action: Auto-approve for All Computers
# Deadline: Immediately

# Правило 2: Critical + Security Updates → Pilot через 3 дня
# When: Classification = Critical Updates, Security Updates
# Action: Auto-approve for Pilot-Workstations
# Deadline: 3 days after approval

# Правило 3: Critical + Security Updates → Office через 7 дней
# (после успешного тестирования на Pilot)
# Action: Auto-approve for Office-Workstations
# Deadline: 7 days after approval

# Правило 4: Cash-Registers — ТОЛЬКО ручное одобрение
# Никаких авто-одобрений! Каждое обновление тестируется
# на совместимость с кассовым ПО

# Правило 5: Серверы — ручное одобрение после Pilot
# Серверы обновляются в maintenance window (воскресенье 02:00)

Логика развёртывания обновлений:

  1. Обновление появляется на upstream-сервере при синхронизации.
  2. Авто-одобрение отправляет его на Pilot-группу (10 ПК).
  3. 3-5 рабочих дней наблюдения. Если проблем нет — одобряем для Office.
  4. Для касс — тестируем на стенде с фискальным регистратором.
  5. После подтверждения — одобряем для Cash-Registers.

Такой подход позволил «ТоргСеть» полностью исключить инциденты с обновлениями: за полгода ни одного случая выхода касс из строя из-за Windows Update.

GPO для WSUS-клиентов и BranchCache

Клиентские компьютеры должны знать, откуда скачивать обновления. Это настраивается через групповую политику.

# GPO: WSUS Client Configuration
# Computer Configuration → Administrative Templates
# → Windows Components → Windows Update

# 1. Specify intranet Microsoft update service location
#    Intranet update service: http://wsus-store01:8530
#    Intranet statistics server: http://wsus-store01:8530

# 2. Configure Automatic Updates
#    Setting: 4 — Auto download and schedule the install
#    Scheduled install day: 0 (Every day)
#    Scheduled install time: 12:00 (обед, минимальная нагрузка на кассы)

# 3. Enable client-side targeting
#    Target group: Office-Workstations  (или Cash-Registers, Servers)

# 4. No auto-restart with logged on users
#    Enabled — не перезагружать, если пользователь работает

# 5. Re-prompt for restart with scheduled installations
#    Wait time: 240 minutes (4 часа)

# 6. Delay Restart for scheduled installations
#    Wait time: 15 minutes

# Проверка настроек на клиенте через реестр:
Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" |
    Select-Object WUServer,WUStatusServer,TargetGroupEnabled,TargetGroup

Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" |
    Select-Object UseWUServer,AUOptions,ScheduledInstallDay,ScheduledInstallTime

BranchCache для WAN-оптимизации — критически важная технология для «ТоргСеть». Без BranchCache каждый компьютер в магазине скачивает обновление с WSUS-сервера по WAN. С BranchCache первый компьютер скачивает обновление, а остальные получают его по LAN от соседей.

# Включение BranchCache на WSUS-сервере (режим Hosted Cache)
Install-WindowsFeature BranchCache
Enable-BCHostedServer -RegisterSCP

# GPO для клиентов BranchCache
# Computer Configuration → Administrative Templates → Network → BranchCache

# Turn on BranchCache: Enabled
# Set BranchCache Distributed Cache mode: Enabled
#   (или Hosted Cache mode, если в магазине есть сервер)
# Set percentage of disk space used for client cache: 10%
# Configure BranchCache for network files: Enabled
#   Latency: 0 (кэшировать всё, не только медленные соединения)

# PowerShell на клиенте:
Enable-BCDistributed
Set-BCCache -MaxCacheSizeAsPercentageOfDiskVolume 10

# Проверка статуса BranchCache
Get-BCStatus | Format-List
Get-BCDataCache | Format-List

Результат внедрения BranchCache: потребление WAN-канала при обновлении снизилось на 85%. Вместо 30 компьютеров, одновременно качающих 2 ГБ через 50 Мбит/с канал, обновление скачивается один раз и раздаётся по гигабитной LAN.

Обслуживание WSUS: очистка и база данных

WSUS без регулярного обслуживания деградирует: база данных растёт, консоль тормозит, синхронизация зависает. Мы настроили автоматическое обслуживание.

# wsus_maintenance.ps1 — еженедельное обслуживание WSUS
$wsus = Get-WsusServer

# 1. WSUS Cleanup Wizard через PowerShell
Write-Host "Starting WSUS Cleanup..." -ForegroundColor Cyan
$cleanupManager = $wsus.GetCleanupManager()
$cleanupScope = New-Object Microsoft.UpdateServices.Administration.CleanupScope
$cleanupScope.DeclineSupersededUpdates = $true       # Отклонить заменённые
$cleanupScope.DeclineExpiredUpdates = $true           # Отклонить истёкшие
$cleanupScope.CleanupObsoleteUpdates = $true          # Удалить устаревшие
$cleanupScope.CompressUpdates = $true                 # Сжать ревизии
$cleanupScope.CleanupObsoleteComputers = $true        # Удалить неактивные ПК
$cleanupScope.CleanupUnneededContentFiles = $true     # Удалить ненужные файлы

$result = $cleanupManager.PerformCleanup($cleanupScope)
Write-Host "Superseded declined: $($result.SupersededUpdatesDeclined)"
Write-Host "Expired declined: $($result.ExpiredUpdatesDeclined)"
Write-Host "Obsolete deleted: $($result.ObsoleteUpdatesDeleted)"
Write-Host "Updates compressed: $($result.UpdatesCompressed)"
Write-Host "Obsolete computers deleted: $($result.ObsoleteComputersDeleted)"
Write-Host "Disk space freed: $([math]::Round($result.DiskSpaceFreed / 1GB, 2)) GB"

# 2. Переиндексация базы данных WID
# WSUS использует Windows Internal Database (WID) по умолчанию
# Переиндексация критически важна для производительности
$wid = "np:\\.\pipe\MICROSOFT##WID\tsql\query"
$reindexSQL = @"
USE SUSDB;
GO
DECLARE @TableName NVARCHAR(256);
DECLARE TableCursor CURSOR FOR
    SELECT '[' + SCHEMA_NAME(schema_id) + '].[' + name + ']'
    FROM sys.tables WHERE type = 'U';
OPEN TableCursor;
FETCH NEXT FROM TableCursor INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC('ALTER INDEX ALL ON ' + @TableName + ' REBUILD');
    FETCH NEXT FROM TableCursor INTO @TableName;
END;
CLOSE TableCursor;
DEALLOCATE TableCursor;
"@

sqlcmd -S $wid -i "C:\Scripts\WSUS\reindex_susdb.sql"
Write-Host "Database reindexed" -ForegroundColor Green

WID vs SQL Server: для «ТоргСеть» с 300 клиентами WID достаточно. SQL Server рекомендуется при более чем 500 клиентах или если нужна детальная отчётность через SQL-запросы. Миграция с WID на SQL возможна через wsusutil:

# Миграция WSUS с WID на SQL Server (при необходимости)
Stop-Service WsusService

# Detach WID database
sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query `
    -Q "EXEC sp_detach_db 'SUSDB'"

# Copy MDF/LDF to SQL Server
Copy-Item "C:\Windows\WID\Data\SUSDB.mdf" "\\SQL01\D$\MSSQL\Data\"
Copy-Item "C:\Windows\WID\Data\SUSDB_log.ldf" "\\SQL01\D$\MSSQL\Data\"

# Attach on SQL Server
sqlcmd -S SQL01 -Q @"
CREATE DATABASE SUSDB ON
(FILENAME = 'D:\MSSQL\Data\SUSDB.mdf'),
(FILENAME = 'D:\MSSQL\Data\SUSDB_log.ldf')
FOR ATTACH;
"@

# Update WSUS registry
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Update Services\Server\Setup" `
    -Name "SqlServerName" -Value "SQL01"

Start-Service WsusService

Отчётность и диагностика проблем

WSUS предоставляет встроенные отчёты через консоль, но для «ТоргСеть» мы создали дополнительные PowerShell-отчёты.

# wsus_compliance_report.ps1 — отчёт о статусе обновлений
$wsus = Get-WsusServer
$scope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
$updateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
$updateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::LatestRevisionApproved
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::NotInstalled

$report = @()
$computers = $wsus.GetComputerTargets($scope)

foreach ($pc in $computers) {
    $neededUpdates = $pc.GetUpdateInstallationInfoPerUpdate($updateScope) |
        Where-Object { $_.UpdateInstallationState -eq 'NotInstalled' }
    
    $report += [PSCustomObject]@{
        ComputerName = $pc.FullDomainName
        IPAddress    = $pc.IPAddress
        OSVersion    = $pc.OSDescription
        LastContact  = $pc.LastReportedStatusTime
        PendingUpdates = $neededUpdates.Count
        Group        = ($pc.GetComputerTargetGroups() | Select-Object -First 1).Name
    }
}

# Сводка по магазинам
$summary = $report | Group-Object Group | ForEach-Object {
    [PSCustomObject]@{
        Store = $_.Name
        TotalPCs = $_.Count
        UpToDate = ($_.Group | Where-Object { $_.PendingUpdates -eq 0 }).Count
        Pending  = ($_.Group | Where-Object { $_.PendingUpdates -gt 0 }).Count
        NoContact = ($_.Group | Where-Object { $_.LastContact -lt (Get-Date).AddDays(-7) }).Count
    }
}

$summary | Format-Table -AutoSize

Типичные проблемы и решения:

# Проблема 1: Клиент не видит WSUS-сервер
# Диагностика на клиенте:
wuauclt /detectnow /reportnow
# Проверяем журнал:
Get-Content "C:\Windows\WindowsUpdate.log" -Tail 50
# Или для Windows 10/11:
Get-WindowsUpdateLog  # Создаёт читаемый лог на рабочем столе

# Проблема 2: Обновления застряли на 0%
# Решение: сброс клиента Windows Update
Stop-Service wuauserv,cryptSvc,bits,msiserver
Remove-Item "C:\Windows\SoftwareDistribution" -Recurse -Force
Remove-Item "C:\Windows\System32\catroot2" -Recurse -Force
Start-Service wuauserv,cryptSvc,bits,msiserver
wuauclt /resetauthorization /detectnow

# Проблема 3: WSUS-консоль зависает при открытии "All Updates"
# Причина: слишком много обновлений без cleanup
# Решение: запустить cleanup через PowerShell (скрипт выше)
# Затем переиндексировать SUSDB

# Проблема 4: Downstream не синхронизируется
# Диагностика:
& "C:\Program Files\Update Services\Tools\wsusutil.exe" checkhealth
# Проверка связности:
Test-NetConnection -ComputerName WSUS-HQ -Port 8530
# Принудительная синхронизация:
$wsus.GetSubscription().StartSynchronization()

Альтернативы WSUS и итоги проекта

WSUS — бесплатное решение, но у него есть ограничения. Для «ТоргСеть» его возможностей достаточно, но крупные организации могут рассмотреть альтернативы:

РешениеСтоимостьПлюсыМинусы
WSUSБесплатноВстроен в Windows Server, прост в развёртыванииОграниченная отчётность, требует обслуживания
SCCM/MECM$$$Полный контроль: ОС, приложения, compliance, инвентаризацияВысокая стоимость и сложность
Intune$$Облачное, MDM, работает без VPNНет downstream, зависит от интернета
WSUS + Windows Update for BusinessБесплатноGPO-управление кольцами обновленийНет одобрения конкретных обновлений

Для «ТоргСеть» WSUS с downstream-серверами и BranchCache оказался идеальным выбором. Результаты за 6 месяцев:

  • Потребление WAN — снижение на 85% благодаря BranchCache.
  • Инциденты с обновлениями — 0 (ранее 2-3 в месяц).
  • Compliance — 98% компьютеров обновлены в течение 7 дней после выхода патча.
  • Время администрирования — 1 час в неделю (ранее 5-6 часов).
  • Стоимость — 0 руб. за лицензии (WSUS входит в Windows Server).

Если вашей организации нужна централизованная система управления обновлениями — обращайтесь к специалистам itfresh.ru. Мы развернём WSUS, настроим политики одобрения и обеспечим безопасность вашей инфраструктуры.

Часто задаваемые вопросы

Зависит от количества продуктов и классификаций. Для типового набора (Windows 10/11, Server 2022, Office, Defender) потребуется 80-150 ГБ. Если включить драйверы — до 500 ГБ и более. Рекомендуем выделить отдельный диск и начать с 200 ГБ, регулярно запуская WSUS Cleanup для контроля размера.
Штатно WSUS обновляет только продукты Microsoft. Для стороннего ПО (Adobe, Java, Chrome) нужны дополнительные инструменты: System Center Updates Publisher (SCUP) или коммерческие решения типа Patch My PC, ManageEngine. Они публикуют обновления стороннего ПО в WSUS-каталог.
WID (Windows Internal Database) — бесплатная встроенная база, подходит для WSUS с менее чем 500 клиентами. SQL Server рекомендуется для крупных развёртываний, обеспечивает лучшую производительность и возможность SQL-запросов для детальной отчётности. Миграция с WID на SQL возможна без переустановки WSUS.
В консоли WSUS найдите обновление, измените статус с Approved на Declined. Это запретит установку на новых компьютерах. Для удаления с тех, где обновление уже установлено, используйте wusa /uninstall /kb:XXXXXXX через GPO Startup Script или SCCM. Declined-обновление не будет предлагаться клиентам при следующей проверке.
Да, WSUS на Windows Server 2022 и 2019 полностью поддерживает обновления Windows 11. Необходимо включить продукт Windows 11 в настройках синхронизации WSUS. Feature Updates для Windows 11 также доступны через WSUS, но их размер (3-4 ГБ) требует учитывать пропускную способность сети.

Нужна помощь с проектом?

Специалисты АйТи Фреш помогут с архитектурой, DevOps, безопасностью и разработкой — 15+ лет опыта

📞 Связаться с нами
#wsus#windows update#управление обновлениями#branchcache#downstream server#wsus cleanup#gpo wsus#автоодобрение обновлений
Комментарии 0

Оставить комментарий

загрузка...