Back to Deliver Windows updates from SBD-WSUS01

COURSE 1.7 · CONFIGURATION CHECKLIST

Deliver Windows updates from SBD-WSUS01

Secure By Design · Edition 2.0 · 14 October 2026

This course gives every Windows system one road for updates. SBD-WSUS01 never touches the internet: each month a WSUS server on the connected side synchronizes the same scope, and its metadata and update files cross on hashed media to be imported inside. Microsoft deprecated WSUS in September 2024 — it gets no new features — but it still ships in Windows Server and is supported for production use, with security and quality updates under the product lifecycle. Ring timings and dates are sample values for your patch owner to set. Linux packages already have their road, SBD-REPO01 (course 1.2); endpoint protection and credentialed scanning are coming soon, as courses 1.9 and 1.10, and nothing here depends on them.

Download the workbook (Word)

Before you start

1. Design the rings and the Windows update rule

About 25 min · Open this lesson

Commands:

# On SBD-ADMIN-SRV01: every Windows computer object and its OU, the input for the ring table
New-Item -ItemType Directory -Force C:\Evidence\patch-protect | Out-Null
([adsisearcher]'(&(objectCategory=computer)(operatingSystem=Windows*))').FindAll() | ForEach-Object { $_.Properties.distinguishedname[0] } | Sort-Object | Set-Content C:\Evidence\patch-protect\windows-computers.txt
(Get-Content C:\Evidence\patch-protect\windows-computers.txt).Count
# On any member: no update policy yet, so no WSUS server is named (expected: no output)
Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' -ErrorAction SilentlyContinue

Verify: The rule names its one source and its exceptions, the ring table places every Windows computer object in exactly one ring with the reason for its place, SBD-AUDIT01 in its custodian-installed group, the timing and crossing calendar are written with an approver, and F06, A01 and A02 are confirmed with owners.

Evidence: Keep the Windows update rule, the computer list and the ring table built from it, the timing and crossing calendar, and the confirmed register rows.

Notes / result / date:

2. Build SBD-WSUS01 as a disconnected server

About 40 min · Open this lesson

Commands:

w32tm /query /source   # a domain controller, never the hypervisor's time provider
Install-WindowsFeature -Name UpdateServices -IncludeManagementTools
& "$env:ProgramFiles\Update Services\Tools\wsusutil.exe" postinstall CONTENT_DIR=D:\WSUS
$wsus = Get-WsusServer
$wsus.GetConfiguration() | Select-Object HostBinariesOnMicrosoftUpdate, DownloadExpressPackages, AllUpdateLanguagesEnabled   # expected after Options: False, False, False
$wsus.GetSubscription() | Select-Object SynchronizeAutomatically   # expected: False
# TLS for metadata: the certificate, the 8531 binding, the five services, then wsusutil
$cert = (Get-Certificate -Template SBDServerAuthentication -SubjectName 'CN=SBD-WSUS01.sbd.test' -DnsName SBD-WSUS01.sbd.test -CertStoreLocation Cert:\LocalMachine\My).Certificate
(Get-WebBinding -Name 'WSUS Administration' -Protocol https).AddSslCertificate($cert.Thumbprint, 'My')
'APIRemoting30', 'ClientWebService', 'DSSAuthWebService', 'ServerSyncWebService', 'SimpleAuthWebService' | ForEach-Object { Set-WebConfigurationProperty -PSPath 'IIS:\' -Location "WSUS Administration/$_" -Filter system.webServer/security/access -Name sslFlags -Value Ssl }
& "$env:ProgramFiles\Update Services\Tools\wsusutil.exe" configuressl SBD-WSUS01.sbd.test
Get-WebBinding -Name 'WSUS Administration' | Select-Object protocol, bindingInformation   # http *:8530, https *:8531
Get-LocalGroupMember 'WSUS Administrators'

Verify: SBD-WSUS01 sits in the Servers OU, takes time from a domain controller, and runs WSUS on WID, stores files locally, never synchronizes, and answers metadata over TLS on 8531 with a certificate that chains to the SBD root; WSUS Administrators holds only the named operators and Tier 0 task accounts; the server is in SBD Tier 0 Console Hosts and forwards its events; and the scope, the database decision, the written Ring 4 procedure, and its residual risk with the Tier 0 target are recorded.

Evidence: Keep the installation and configuration output, the scope and database decisions, the certificate and binding details, the WSUS Administrators list, the group memberships, the written Ring 4 procedure, and the exception-record entry for the residual risk and its Tier 0 target.

Notes / result / date:

3. Carry updates across the air gap

About 35 min · Open this lesson

Commands:

# Connected side, on the export server, once every needed file has downloaded
& "$env:ProgramFiles\Update Services\Tools\wsusutil.exe" export E:\2026-10\wsus-export.xml.gz E:\2026-10\export.log
robocopy D:\WSUS\WsusContent E:\2026-10\WsusContent /E   # the first crossing carries the whole folder
Get-ChildItem E:\2026-10 -Recurse -File | Get-FileHash -Algorithm SHA256 | Export-Csv E:\connected-side-hashes.csv -NoTypeInformation
# Inside, on SBD-WSUS01, with the media as E: (no output from Compare-Object means every hash matches)
$t = 'C:\Evidence\patch-protect\transfer\2026-10'; New-Item -ItemType Directory -Force $t | Out-Null
Get-ChildItem E:\2026-10 -Recurse -File | Get-FileHash -Algorithm SHA256 | Export-Csv "$t\lab-side-hashes.csv" -NoTypeInformation
Compare-Object (Import-Csv E:\connected-side-hashes.csv).Hash (Import-Csv "$t\lab-side-hashes.csv").Hash
robocopy E:\2026-10\WsusContent D:\WSUS\WsusContent /E
& "$env:ProgramFiles\Update Services\Tools\wsusutil.exe" import E:\2026-10\wsus-export.xml.gz "$t\import.log"
Copy-Item E:\connected-side-hashes.csv, E:\2026-10\export.log -Destination $t

Verify: The export server's scope matches lesson 2's record, every hash matches on both sides, the import log reports success, the month's updates appear on SBD-WSUS01, and the crossing record is complete.

Evidence: Keep the export server's scope settings, both hash lists and their comparison, the custody record, the export and import logs, and the crossing record with the package hash and file count.

Notes / result / date:

4. Target the rings with computer groups and Group Policy

About 40 min · Open this lesson

Commands:

# On SBD-WSUS01: the four ring groups and client-side targeting
$wsus = Get-WsusServer
'Ring 1 - Pilot', 'Ring 2 - Workstations', 'Ring 3 - Member servers', 'Ring 3 - Audit archive', 'Ring 4 - Tier 0' | ForEach-Object { [void]$wsus.CreateComputerTargetGroup($_) }
$config = $wsus.GetConfiguration(); $config.TargetingMode = 'Client'; $config.Save()
# On AdminJumpBox01 (Tier 0): the links in order, and the pilot GPO's security filter
(Get-GPInheritance -Target 'OU=Workstations,OU=SBD,DC=sbd,DC=test').GpoLinks | Select-Object Order, DisplayName
Get-GPPermission -Name 'SBD WSUS Ring 1 - Pilot' -All | Select-Object @{ n = 'Trustee'; e = { $_.Trustee.Name } }, Permission
# On one member of each ring, after gpupdate /force: its server, its ring, and a detection now
Get-ItemProperty HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate | Select-Object WUServer, TargetGroup, DoNotConnectToWindowsUpdateInternetLocations
(New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow()
# Back on SBD-WSUS01: each ring's members, and nobody unassigned
Get-WsusComputer -ComputerTargetGroups 'Ring 1 - Pilot' | Select-Object FullDomainName, LastSyncTime
Get-WsusComputer -ComputerTargetGroups 'Unassigned Computers'   # expected: no computers

Verify: The WSUS console shows the four ring groups and Ring 3 - Audit archive, with Options set to use Group Policy (client-side targeting); Group Policy Management shows each ring's GPO linked where its computers live, with the pilot filter and link order in place; Group Policy Results for one member of each ring shows SBD-WSUS01 and its ring; every Windows computer sits in its ring's group; and Unassigned Computers is empty.

Evidence: Keep the GPO reports with their links and security filtering, the pilot group's members, each ring's member list from SBD-WSUS01, the policy values from one member per ring, and the install-time and deadline table, with SBD-AUDIT01's custodian-started installs.

Notes / result / date:

5. Run the first cycle and prove it

About 40 min · Open this lesson

Commands:

# On SBD-WSUS01 (Tier 1): approve for the pilot; deadlines are set in the console's Approve Updates dialog
Get-WsusUpdate -Classification All -Approval Unapproved -Status FailedOrNeeded | Approve-WsusUpdate -Action Install -TargetGroupName 'Ring 1 - Pilot'
Get-WsusComputer -ComputerTargetGroups 'Ring 1 - Pilot' -ComputerUpdateStatus FailedOrNeeded   # expected: none once the ring is clean
Get-WsusComputer -ToLastReportedStatusTime (Get-Date).AddDays(-7)   # computers silent for a week
# On AdminJumpBox01 (Tier 0): who approved each Ring 4 update, then each controller in turn
$wsus = Get-WsusServer -Name SBD-WSUS01.sbd.test -PortNumber 8531 -UseSsl
$wsus.GetUpdateApprovals((New-Object Microsoft.UpdateServices.Administration.UpdateScope)) | Where-Object { $_.GetComputerTargetGroup().Name -eq 'Ring 4 - Tier 0' } | Select-Object CreationDate, AdministratorName, Action
dcdiag /s:SBD-DC02 /q; repadmin /replsummary   # after SBD-DC02 restarts, before SBD-DC01
# Spot check from SBD-ADMIN-SRV01: what a system itself says it installed
Invoke-Command SBD-DHCP01 { Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 3 HotFixID, InstalledOn }
# Back on SBD-WSUS01, once every ring has installed
Invoke-WsusServerCleanup -DeclineSupersededUpdates -DeclineExpiredUpdates -CleanupObsoleteUpdates -CleanupUnneededContentFiles -CleanupObsoleteComputers

Verify: Each ring installed the month's updates in the written order with its promotion recorded, SBD-AUDIT01's custodian installed its updates, every Ring 4 approval names a Tier 0 account, both controllers were healthy between installs, no computer is failing or silent without an explanation, the spot checks agree with WSUS, SBD-WSUS01 has its first baseline with every open item classified, and the course's records are hashed.

Evidence: Keep the per-ring approval and install timeline with the custodian's install record for SBD-AUDIT01, the Ring 4 approval history and install record, the compliance and silent-computer reports, the spot checks, the cleanup output, the SCC results and STIG Viewer checklist with classified findings, the manifest, and the handoff note to course 1.8.

Notes / result / date:

Sources