functions/System/Get-WindowsUpdateStatus.ps1
|
function Get-WindowsUpdateStatus { <# .SYNOPSIS Retrieves the current Windows Update status and available updates. .DESCRIPTION Queries the Windows Update COM object to check for available updates. Returns a PSCustomObject with count of available, security, and critical updates. Logs all errors through the central Write-Log function. .PARAMETER None .EXAMPLE $status = Get-WindowsUpdateStatus if ($status.AvailableUpdates -gt 0) { Write-Output "Updates available: $($status.AvailableUpdates)" } .NOTES DEPENDENCIES: Write-Log (Core) APPLIES TO: Windows Server 2016+, Windows 10+ #> [CmdletBinding(SupportsShouldProcess)] param() $ErrorActionPreference = 'Stop' try { $updateSession = New-Object -ComObject Microsoft.Update.Session $updateSearcher = $updateSession.CreateUpdateSearcher() Write-Log -Message "Searching for available Windows updates..." -Level Info -Caller $MyInvocation.MyCommand.Name $searchResult = $updateSearcher.Search("IsInstalled=0") $availableUpdates = $searchResult.Updates $securityUpdates = $availableUpdates | Where-Object { $_.Categories.Name -contains "Security Updates" } $criticalUpdates = $availableUpdates | Where-Object { $_.Categories.Name -contains "Critical Updates" } $otherUpdates = $availableUpdates | Where-Object { $_.Categories.Name -notcontains "Security Updates" ` -and $_.Categories.Name -notcontains "Critical Updates" } $updateCount = ($availableUpdates | Measure-Object).Count $securityCount = ($securityUpdates | Measure-Object).Count $criticalCount = ($criticalUpdates | Measure-Object).Count $otherCount = ($otherUpdates | Measure-Object).Count Write-Log -Message "Update search completed: $updateCount total ($securityCount security, $criticalCount critical, $otherCount other)" ` -Level Info -Caller $MyInvocation.MyCommand.Name return [PSCustomObject]@{ AvailableUpdates = $updateCount SecurityUpdates = $securityCount CriticalUpdates = $criticalCount OtherUpdates = $otherCount AllUpdates = $availableUpdates SecurityUpdatesList = $securityUpdates CriticalUpdatesList = $criticalUpdates } } catch { Write-Log -Message "Error checking Windows Update status: $($_.Exception.Message)" ` -Level Error -Caller $MyInvocation.MyCommand.Name throw } } |