Public/Get-LGEolStatus.ps1
|
function Get-LGEolStatus { <# .SYNOPSIS Checks installed software against the built-in EOL database. .EXAMPLE Get-LGEolStatus .EXAMPLE $sw = Get-LGInstalledSoftware; Get-LGEolStatus -SoftwareCache $sw #> [CmdletBinding()] param( [PSCustomObject[]]$SoftwareCache = $null ) $L = Get-LGEffectiveStrings $cfg = Get-LGEffectiveConfig $today = Get-Date Write-LGHeader $L['hdrEol'] $rows = if ($SoftwareCache) { $SoftwareCache } else { Get-LGSoftwareRegistryRows -WarnDays $cfg.WarnDaysBeforeExpiry } $found = [System.Collections.Generic.List[PSCustomObject]]::new() $eolHit = 0 foreach ($sw in $rows) { foreach ($entry in $script:LGEolDatabase) { $match = switch ($entry.MatchType) { 'contains' { $sw.Name -like "*$($entry.Pattern)*" } 'startsWith' { $sw.Name -like "$($entry.Pattern)*" } 'exact' { $sw.Name -eq $entry.Pattern } 'regex' { $sw.Name -match $entry.Pattern } default { $false } } if ($match) { try { $eolDate = [datetime]::ParseExact($entry.EolDate, 'yyyy-MM-dd', $null) $daysLeft = ($eolDate - $today).Days $status = if ($daysLeft -lt 0) { 'EXPIRED' } else { 'WARN' } $detail = if ($daysLeft -lt 0) { "EOL: $($entry.EolDate) ($([math]::Abs($daysLeft)) days ago)" } else { "EOL approaching: $($entry.EolDate) ($daysLeft days left)" } Write-LGStatus $sw.Name $detail $status $found.Add([PSCustomObject]@{ Module = 'EOL' Name = $sw.Name Status = $status Detail = $detail EolDate = $entry.EolDate ComputerName = $env:COMPUTERNAME }) $eolHit++ } catch {} break } } } if ($eolHit -eq 0) { Write-LGStatus 'EOL scan' 'No end-of-life software detected' 'OK' } $found } |