Posted in : Microsoft, Windows Server

4 years ago

Verifiera patchar på servrar är något som måste göras och är ofta tidskrävande.
Det finns verktyg från Microsoft samt övervakningssystem för att skanna patchnivå m.m men ibland behövs det endast en snabb första kontroll för att se till att servrarna har blivit patchade.
Jag har skrivit några rader i powershell för att snabbt, asynkront skanna maskiner enligt en array med enkel presentation. Koden inventerar om patchar har installerats de senaste 2 dygnen och listar antalet patchar samt senaste uppstart.

# array of computernames
$comps = "SRV-ADFS-01","SRV-MGMT-01"
# Async processing, read patch status and boot time
$comps | ForEach-Object{
    Start-Job -InputObject "$_" -ScriptBlock {
        $thiscomp = "$input"
        $last2days = ((Get-Date).AddDays(-2))
        Try{
            $err = $false
            $cobj = Get-HotFix -ComputerName $thiscomp -ErrorAction Stop | Where-Object {$_.InstalledOn -gt $last2days}
            IF($cobj){
                $Patched = $true
                $pcount = $cobj.Count
            }
            Else{
                $patched = $false
                $pcount = "N/A"
            }
            $BootTime = Get-WmiObject win32_operatingsystem -ComputerName $thiscomp -ErrorAction Stop | select @{LABEL=’LastBootUpTime’;EXPRESSION={$_.ConverttoDateTime($_.lastbootuptime)}}
            $BootTime = $BootTime | select -ExpandProperty LastBootUpTime
        }
        Catch{
            $Patched = $false
            $err = $true
        }
        @{"Name"=$thiscomp;"Patched"=$Patched;"PatchCount"=$pcount;"LastBoot"=$BootTime;"Error"=$err}
    } -Name $_
}
# Collect data
$jobdata = @()
$more = $true
While($more){
    Write-host "." -nonewline
    #Get-job -State Completed | Receive-Job -keep
    $jobdata += Get-job -State Completed | Receive-Job
    Get-Job -HasMoreData $false | Remove-Job
    If(-not(Get-Job)){$more = $false}
    Start-sleep 2
}
# Make it more readable
$DataTable = new-object System.Data.dataTable
$jobdata[0].Keys | ForEach-Object{$DataTable.Columns.Add($_) | Out-Null}
$jobdata | ForEach-Object{
    $row = $DataTable.NewRow()
    $thisobj = $_
    $thisobj.Keys | ForEach-Object{
        $row["$_"] = $thisobj.$_
    }
    $DataTable.Rows.Add($row)
}
$DataTable | Out-GridView -Title "Patch status"

Vid körning skapas jobb upp för seriell hantering.
psjobs
Efter körning presenteras jobben i en sökbar lista eller kan exporteras till en fil.
job2
Vid fel (behörigheter, nätverk etc) fylls error kollumnen i och dessa bör hanteras manuellt.

Tags : Microsoft, Patch, PowerShell

Add comment

Your comment will be revised by the site if needed.