Afin de pouvoir communiquer sur les KB qui devront être prochainement appliqués sur les stations de travail pilotes, j’ai réalisé un script permettant de récupérer la liste des patchs qui sont en statut FailedOrNeeded et qui sont Unapproved dans WSUS, avec un filtre supplémentaire appliqué plus tard sur le nom afin de rejeter ceux qui concernent les serveurs et le .NET Framework.
De plus, je souhaitais uniquement récupérer les mises à jour qui ne sont pas Superseded, signifiant qu’elles ne sont pas écrasées ou incluses dans d’autres patchs (par exemple, le KB numéro 12345 est un patch cumulatif et contient les KB 2345 et 4567, par conséquent je ne veux pas tester ces deux derniers mais uniquement 12345) ; ce qui force une double requête, transmise dans le pipe.
Write-Host "WSUS Updates CSV Export Script"
Write-Host "=============================="
Write-Host `r`n
Write-Host "Retrieving unapproved and failed or needed WSUS Updates.`r`nThis might take a couple of minutes..."
$output = @()
$UpdateList = Get-WsusUpdate -Approval Unapproved -Status FailedOrNeeded -Classification All | Where {($_.Update.IsSuperseded -eq $false) -and ($_.Update.KnowledgeBaseArticles -ne $null) }
Write-Host "Filtering and exporting to CSV..."
foreach ($Update in $UpdateList) {
if ($Update.Update.Title.Contains("Server") -eq $false -and $Update.Update.Title.Contains("Framework") -eq $false){
$title = $Update.Update.Title
$kbnumber = $Update.Update.KnowledgeBaseArticles
$product = $Update.Update.ProductTitles
$classif = $Update.Update.UpdateClassificationTitle
$date = $Update.Update.CreationDate
$UpdatePSO = New-Object PSCustomObject
$UpdatePSO | Add-Member -Type NoteProperty -Name "Title" -Value $title
$UpdatePSO | Add-Member -Type NoteProperty -Name "KB" -Value $kbnumber
$UpdatePSO | Add-Member -Type NoteProperty -Name "Product" -Value $product
$UpdatePSO | Add-Member -Type NoteProperty -Name "Class" -Value $classif
$UpdatePSO | Add-Member -Type NoteProperty -Name "Date" -Value $date
$output+=$UpdatePSO
}
}
$output | Export-CSV wsus-export-unapproved-failed.csv
Write-Host "Done."
J’ai choisi une séparation des colonnes avec un point-virgule car il y a des virgules dans les titres de certaines mises à jour ; il faudra donc veiller à bien spécifier que le point-virgule est le séparateur lors de l’ouverture du fichier CSV dans Excel. Ensuite, d’autres filtres sont possibles dans le tableur, on pourra donc exclure les mises à jour qui ne sont pas de sécurité par exemple.
Ce script, plutôt adapté à mon cas, peut être facilement modifié pour coller aux filtres que vous souhaitez appliquer, soit dans la requête WSUS de base, soit dans le foreach traité juste après.