КЭНК: тихое удаление обновления Windows по номеру KB
Задача: тихо удалить с хоста обновление Windows по номеру KB.
Какое-то время проблема легко решалась через wusa.exe /uninstall /kb:XXXXXX /quiet, но теперь в Windows 10 команда с ключом quiet просто игнорируется, а без ключа — задает много вопросов пользователю, что ожидаемо, но не подходит для решения задачи.
В интернетах быстро гуглится способ, который хорош, но не универсален. Способ рассчитывает на то что KB будет упомянута в имени пакета для DISM, а это бывает не всегда — в примере ниже у двух последних обновлений номера KB в имени пакета нет.
Ситуацию усложняет то, что в разных локалях ОС команда dism выдает информацию на разных языках, да к тому же не структурированным объектом — а строкой. К счастью, из строки все же можно выцепить имя пакета, а по нему — запросить подробную информацию (тоже строкой), где номер KB есть (судя по моим тестам) всегда:
Итоговое решение задачи такое:
- смотрим список всех установленных обновлений и выдергиваем имена пакетов
- по каждому пакету смотрим расширенное описание и ищем в нём искомый номер KB
- если в описании найден нужный номер KB — пакет по его имени отправляется на деинсталляцию через DISM.exe /Online /Remove-Package /PackageName:$sFoundPackageName /quiet /norestart
Короткий сниппет, иллюстрирующий подход:
$sKBNumber = "4578968"
$aUpdts = dism /online /get-packages | ? {$_.Contains("Package_for")} | %{($_.Split(":"))[1].Trim()}
foreach ($sUpdate in $aUpdts) {
$sInfo = (dism /online /get-packageinfo /packagename:$sUpdate) -join(", ")
if ($sInfo.Contains($sKBNumber)) {
write-host "Found package $sUpdate for KB number $sKBNumber"
# uncomment below to uninstall package
# DISM.exe /Online /Remove-Package /PackageName:$sUpdate /quiet /norestart
}
}
КЭНК! Слава роботам!