Powershell : désinstallation des hotfix Windows installés à une date spécifiée

J’ai développé pour le compte d’un collègue un script Powershell permettant de lister les hotfix Windows installés à une date spécifiée par l’utilisateur et proposant de les désinstaller, par exemple dans le cadre d’une campagne de patch mal déroulée sur une station ou un serveur.

Le script récupère la liste des patchs – Windows uniquement – installés le jour spécifié, extrait le numéro de KB et passe ensuite en argument de la ligne de commande de désinstallation de paquets Windows Update ce numéro en évitant un redémarrage.

Write-Host "Windows Operating System Hotfix KB remover"
Write-Host "==========================================`r`n"
$instdate = Read-Host "Please input the date KB were installed on."
$instdate = $instdate -as [datetime]
if($instdate -eq $null) { Write-Host "Please input a valid date.`r`nBye." ; exit }
$hotfixlist = Get-Hotfix | Where-Object { $_.InstalledOn -eq $instdate }
if($hotfixlist -eq $null) { Write-Host "No KBs installed for the specified date.`r`nBye." ; exit }
Write-Host "KB list for"$instdate
echo $hotfixlist
$choice = Read-Host "`r`nDo you want to uninstall those KBs ? (y to uninstall - any other input will cancel)"
if($choice -eq "y") {
foreach($kb in $hotfixlist){
$kbid = $kb.HotfixID.Substring(2,$kb.HotfixID.Length-2)
Write-Host "Uninstalling"$kbid
wusa.exe /uninstall /KB:$kbid /norestart
Write-Host "Please press ENTER only once the update wizard is closed because only one instance of it can be started at a time." -ForegroundColor "Yellow"
Read-Host
}
}
Write-Host "Bye."

Une pause marquée par le Read-Host est obligatoire après l’exécution de la commande de désinstallation sinon le script les exécute toutes à la suite, ce qui ne fonctionne pas puisque seule une instance de wusa.exe peut être lancée en même temps.

Lien pour marque-pages : Permaliens.

Un Commentaire

  1. J’ai modifié un peu ton code, comme on ne connait pas forcément la date.

    Write-Host « Windows Operating System Hotfix KB remover »
    Write-Host « ==========================================rn »
    $hotfixlist = Get-Hotfix | Sort-Object installedOn -Descending
    $hotfixlist
    foreach ($kb in $hotfixlist) {
    $choice = Read-Host « rnDo you want to uninstall this KBs ?rn$($kb.HotFixID) (y to uninstall, q for quit) »
    if($choice -eq « y ») {
    $kbid = $kb.HotfixID.Substring(2,$kb.HotfixID.Length-2)
    Write-Host « Uninstalling »$kbid
    « wusa.exe /uninstall /KB:$kbid /norestart »
    } elseif ($choice -eq « q ») {
    BREAK
    }
    }

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.