RU | EN | DE

Шаг 1. Подготовь скрипт

Создай файл: Force-WSUSCheckIn.ps1

Содержимое такое:

[CmdletBinding()]  
param()  
  
$ErrorActionPreference = 'Stop'  
  
$LogDir = 'C:\ProgramData\WSUS'  
$LogFile = Join-Path $LogDir 'Force-WSUSCheckIn.log'  
  
if (-not (Test-Path $LogDir)) {  
    New-Item -Path $LogDir -ItemType Directory -Force | Out-Null  
}  
  
function Write-Log {  
    param(  
        [string]$Message,  
        [string]$Level = 'INFO'  
    )  
  
    $line = '{0} [{1}] {2}' -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'), $Level, $Message  
    Add-Content -Path $LogFile -Value $line  
    Write-Output $line  
}  
  
try {  
    Write-Log '--- Start WSUS trigger ---'  
  
    try {  
        $wua = Get-Service -Name wuauserv -ErrorAction Stop  
        if ($wua.Status -ne 'Running') {  
            Write-Log 'Starting service wuauserv'  
            Start-Service -Name wuauserv -ErrorAction Stop  
            Start-Sleep -Seconds 3  
        }  
        else {  
            Write-Log 'Service wuauserv already running'  
        }  
    }  
    catch {  
        Write-Log "Could not verify/start wuauserv: $($_.Exception.Message)" 'WARN'  
    }  
  
    Write-Log 'Creating Microsoft.Update.Session COM object'  
    $updateSession = New-Object -ComObject Microsoft.Update.Session  
  
    Write-Log 'Running update search'  
    $searchResult = $updateSession.CreateUpdateSearcher().Search("( IsInstalled = 0 and IsHidden = 0 )")  
  
    if ($null -ne $searchResult -and $null -ne $searchResult.Updates) {  
        Write-Log ("Search completed successfully. Updates found: {0}" -f $searchResult.Updates.Count)  
    }  
    else {  
        Write-Log 'Search completed, but result object is empty' 'WARN'  
    }  
  
    Write-Log '--- Finish WSUS trigger OK ---'  
    exit 0  
}  
catch {  
    Write-Log ("ERROR: {0}" -f $_.Exception.Message) 'ERROR'  
    Write-Log '--- Finish WSUS trigger FAILED ---' 'ERROR'  
    exit 1  
}

Шаг 2. Положи скрипт в доступное место

Проще всего — в SYSVOL, чтобы всем серверам домена было удобно читать файл.

Например: \\domain.local\SYSVOL\domain.local\scripts\WSUS\Force-WSUSCheckIn.ps1

Если папки WSUS нет — создай её.

Важно:

  • у компьютеров домена должен быть Read к этому пути
  • менять права обычно не нужно, у SYSVOL это обычно уже работает как надо

Шаг 3. Создай группу безопасности для проблемных серверов

В ADUC: dsa.msc

Дальше:

  • открой контейнер, где хранишь группы, например Groups
  • RechtsklickNeuGruppe
  • Имя: GG_WSUS_ProblemServers
  • Typ: Sicherheit
  • Bereich: Global
  • OK

Потом добавь в неё 20 серверов:

  • открыть свойства группы
  • вкладка Mitglieder
  • Hinzufügen
  • добавить компьютерные объекты серверов

Это безопасный способ ограничить применение GPO без изменения OU-структуры. Security filtering позволяет применять GPO только к членам заданной группы.

Шаг 4. Создай новый GPO

Открой: gpmc.msc

Дальше:

  • раскрой:
    • Forest: rrlnz.local
    • Domains
    • rrlnz.local

Теперь есть два варианта, куда линковать GPO:

Вариант A — самый простой

Линкуй на сам домен:

  • Rechtsklick на domain.local
  • Create a GPO in this domain, and Link it here…

Имя, например:
GPO_WSUS_ForceCheckIn_ProblemServers

Это сработает, если серверы разбросаны по разным OU, а ты хочешь одну точку управления. Применение потом ограничим security filtering. GPO scope определяется ссылкой на site/domain/OU, а фактическое применение можно дополнительно ограничить фильтрацией и таргетингом.

Вариант B — если есть общий верхний OU

Можно линковать выше по дереву, но не обязательно.

Шаг 5. Настрой Security Filtering

Выдели созданный GPO в GPMC.

На вкладке Scope:

В блоке Security Filtering

  • удали Authenticated Users
  • добавь группу GG_WSUS_ProblemServers

После этого GPO будет применяться только к серверам из этой группы, даже если линк стоит на уровне домена. Это как раз стандартный сценарий security filtering для GPO.

Важно

Проверь на вкладке DelegationAdvanced, чтобы у группы GG_WSUS_ProblemServers были права:

  • Read
  • Apply group policy

Обычно при правильном добавлении через Security Filtering это выставляется как нужно.

Шаг 6. Отредактируй GPO

Rechtsklick на GPO → Bearbeiten Откроется Gruppenrichtlinienverwaltungs-Editor.

Шаг 7. Добавь копирование файла через Preferences → Files

Иди сюда: Computerkonfiguration -> Einstellungen -> Windows-Einstellungen -> Dateien

Если у тебя английская оснастка, это будет: Computer Configuration -> Preferences -> Windows Settings -> Files

Теперь:

  • Rechtsklick → NeuDatei

Заполни:

Allgemein

  • Aktion: Aktualisieren
  • Quelldatei:
    \\rrlnz.local\SYSVOL\rrlnz.local\scripts\WSUS\Force-WSUSCheckIn.ps1
  • Zieldatei:
    C:\ProgramData\WSUS\Force-WSUSCheckIn.ps1

Почему Aktualisieren, а не Ersetzen:

  • Update обычно достаточно и мягче в сопровождении
  • файл будет обновляться при изменении GPO preference item Preferences node и Files item используются именно для таких дополнительных настроек и развёртывания файлов.

Шаг 8. Добавь Scheduled Task через Preferences

Иди сюда: Computerkonfiguration -> Einstellungen -> Systemsteuerungseinstellungen -> Geplante Tasks

В английском: Computer Configuration -> Preferences -> Control Panel Settings -> Scheduled Tasks

Теперь:

  • Rechtsklick → Neu
  • выбери Geplanter Task (mindestens Windows 7)
    или аналогичный вариант для новой ОС

Вкладка Allgemein

Заполни так:

  • Aktion: Erstellen
  • Name: Force-WSUS-CheckIn
  • Beschreibung:
    Runs Microsoft.Update.Session search to force WSUS check-in on problematic servers
  • Ausführen als / Sicherheitsoptionen:
    NT AUTHORITY\SYSTEM
  • включить:
    • Unabhängig von der Benutzeranmeldung ausführen
    • Mit höchsten Privilegien ausführen Запуск от SYSTEM для компьютерной задачи здесь правильнее, чем от доменного администратора.

Вкладка Trigger

Добавь два триггера.

Trigger 1

  • Neu
  • Aufgabe starten: Beim Start
  • Verzögern für: 20 Minuten

Trigger 2

  • Neu
  • Aufgabe starten: Nach Zeitplan
  • Einstellung: Täglich
  • Start: 03:15:00
  • если доступно поле задержки:
    • Verzögern für: 1 Stunde
  • включить Aktiviert

Здесь идея простая: один запуск после старта сервера и один плановый запуск в сутки. Это не конфликтует с обычной обработкой Group Policy и не создаёт слишком агрессивный шум. Компьютерные GPO применяются при старте и затем обновляются периодически в фоне.

Вкладка Aktionen

Добавь одно действие:

  • Programm/Skript:
    powershell.exe
  • Argumente hinzufügen: -NoProfile -ExecutionPolicy Bypass -File “C:\ProgramData\WSUS\Force-WSUSCheckIn.ps1”
  • Starten in: C:\ProgramData\WSUS

Вкладка Bedingungen

Я бы сняла слишком жёсткие ограничения:

  • убрать зависимость от Netzstrom, если это серверы в VM и поле вообще есть
  • не завязывать на Idle

Вкладка Einstellungen

Поставь:

  • Aufgabe kann bei Bedarf ausgeführt werden
  • Aufgabe so schnell wie möglich nach einem verpassten Start ausführen
  • Wenn die Aufgabe bereits ausgeführt wirdKeine neue Instanz starten Group Policy Preferences поддерживают Scheduled Tasks и item-level targeting для preference items, если нужно ещё сильнее сузить применение отдельных элементов.

Шаг 9. Нужно ли ещё делать Item-level targeting

Не обязательно, если ты уже используешь Security Filtering через группу GG_WSUS_ProblemServers.

Но если хочешь “двойную страховку”, можно у обоих preference items — и у File, и у Scheduled Task — включить таргетинг.

Как включить

Открой item → вкладка Gemeinsam / Common

  • поставить галочку Elementbezogene Zielgruppenadressierung
  • нажать Zielgruppenadressierung…

Там можно добавить:

  • Security Group
  • и указать GG_WSUS_ProblemServers

Или даже конкретные имена компьютеров. Microsoft прямо указывает, что item-level targeting позволяет делать так, чтобы отдельные preference items применялись только к выбранным компьютерам внутри одного GPO.

Мой совет

Сделай так:

  • Security Filtering на уровне GPO
  • и без item-level targeting на первом проходе

Это проще.
Если потом увидишь, что нужно ещё уже — добавишь targeting.

Шаг 10. Форсируй применение на одном тестовом сервере

На одном проблемном сервере выполни:

gpupdate /force

Потом перезагрузи сервер или хотя бы проверь, появилась ли задача.

Почему перезагрузка полезна: компьютерные настройки GPO применяются при старте машины, а Scheduled Task как computer preference часто удобнее валидировать после normal startup cycle.

Шаг 11. Проверь, что GPO реально пришла

Вариант 1 — gpresult

На сервере:

gpresult /h C:\Temp\gpresult.html

Открой файл C:\Temp\gpresult.html и проверь:

  • Applied GPOs
  • есть ли там GPO_WSUS_ForceCheckIn_ProblemServers

Microsoft документирует gpresult как стандартный способ увидеть результирующие политики.

Вариант 2 — Group Policy Results Wizard

В GPMC:

  • Group Policy Results
  • Group Policy Results Wizard
  • выбери нужный сервер

Это тоже официальный способ посмотреть реально применившиеся GPO.

Вариант 3 — логи

Если GPO не пришла, смотри:

  • Event Viewer
  • Applications and Services Logs -> Microsoft -> Windows -> GroupPolicy -> Operational

Microsoft рекомендует этот журнал для troubleshooting применения GPO. Если проблема именно с Preferences, их события пишутся в Application log, а дополнительная детализация может включаться через Group Policy logging/tracing.

Шаг 12. Проверь задачу и лог скрипта

На сервере:

Get-ScheduledTask -TaskName “Force-WSUS-CheckIn”
Get-ScheduledTaskInfo -TaskName “Force-WSUS-CheckIn”

Потом посмотри лог:

Get-Content C:\ProgramData\WSUS\Force-WSUSCheckIn.log -Tail 50

Если хочешь сразу запустить вручную:

Start-ScheduledTask -TaskName “Force-WSUS-CheckIn”

Шаг 13. После проверки — распространяй на все 20

Когда один сервер отработал:

  • убедись, что файл копируется
  • задача создаётся
  • лог пишется
  • WSUS обновляется

Потом просто дождись обновления Group Policy на остальных серверах или сделай выборочный gpupdate /force.