В прошлый четверг с утра в чат прилетел вопрос от участника ПИОНЕР: почему одно обновление корректно отправилось в чулан для необязательных, а другое скачалось и установилось самостоятельно.
Обновление .NET Framework я разберу в следующей статье, а сейчас сосредоточусь на KB5026446. Это была предварительная версия обновления Момент 3 для Windows 11. Некоторые функции из него только что продемонстрировали на конференции Build 2023.
Предварительные обновления доставляются в Windows Update с 2018 года, и я подробно разбирал тему в блоге. Я также возвращался к вопросу год спустя, когда Microsoft перестала маркировать предварительные версии таковыми в центре обновления Windows 11.
Впрочем, обсуждаемое обновление было четко помечено предварительным.
[+] Сегодня в программе
Первичный сбор сведений
Исходное заявление было «просто открыл Windows Update, а там уже все устанавливается». Однако под пытками ПИОНЕР сознался, что нажимал руками заветную кнопку «Проверить обновления». Но в стабильной версии, в отличие от инсайдерских, это не должно повлечь автоматическую загрузку и установку.
Смысл ручной проверки в том, чтобы получить обновление или новую версию пораньше, когда до вас ещё не дошла волна или его вообще предлагают только по запросу. Но дальше необязательные обновления все равно надо устанавливать вручную.
Если поверить участнику чата на слово, должны быть и другие «жертвы». Тогда логично начать проверку со своей системы, которая была включена с вечера, но впоследствии ушла в сон автоматически. Однако открывать WU мне не хотелось – вдруг там баг, форсирующий загрузку и установку. Мы пойдем другим путем.
Как из консоли проверить состояние обновления
Популярный командлет Get-Hotfix не подходит — неочевидно, нестабильно и со слов премьер-поддержки не поддерживается для этой цели. Есть варианты понадежнее: инвентаризация пакетов и журнал установки.
Отмечу, что оба способа также отвечают на вопрос, требуется ли в данный момент перезагрузка ОС для установки обновления.
Вопрос не праздный с точки зрения диагностики. Особенно в случаях, когда установка выполняется в тихом режиме, без графического интерфейса. Например, при установке посредством wusa с ключами /quiet /norestart
ОС не сигнализирует пользователю о необходимости перезагрузки.
Инвентаризация пакетов
Способ хорош тем, что берет текущее состояние из первоисточника. Хотя получение списка пакетов с Get-WindowsPackage обычно занимает не менее нескольких секунд. Я показывал этот ванлайнер в канале Telegram.
Get-WindowsPackage -Online -PackageName *RollupFix* | Sort-Object -Descending | Select-Object -First 2 | fl PackageName,InstallTime,PackageState,SupportInformation
В личке мне попеняли на неэффективность серии конвейеров, но по сравнению с длительностью выборки пакетов это мелочи. На выходе два последних накопительных.
PackageName : Package_for_RollupFix~31bf3856ad364e35~amd64~~22621.1778.1.17 InstallTime : 5/25/2023 5:24:32 PackageState : InstallPending SupportInformation : https://support.microsoft.com/help/5026446 PackageName : Package_for_RollupFix~31bf3856ad364e35~amd64~~22621.1702.1.9 InstallTime : 5/11/2023 0:07:38 PackageState : UninstallPending SupportInformation : https://support.microsoft.com/help/5026372
Это типичная ситуация в процессе установки обновлений: новое накопительное KB5026446 применилось и ждет перезагрузки чтобы установиться, а старое KB5026372 — чтобы «удалиться». Беру в кавычки, потому что на самом деле оно перейдет в состояние замещенного. В дальнейшем оно сможет вернуться на сцену в случае удаления нового.
И да, у меня без спроса скачалось и установилось предварительное обновление!
Журнал установки
Выборка из журнала событий Setup с помощью хэш-таблицы выполняется в разы быстрее проверки пакетов. К тому же, изредка сбор сведений о пакетах зависает или завершается ошибкой. Наконец, журнал покажет всю историю установок конкретного обновления, включая неудачи.
В общем случае смотрим источник Servicing и события:
- 1 – инициализация установки или удаления
- 4 – ожидание перезагрузки для вступления изменений в силу
- 2 – результат после перезагрузки
Этот код я использую на работе для поиска нескольких конкретных обновлений одновременно, поэтому здесь выборка по KB и foreach.
$kbids = @('5026446') $events = Get-WinEvent -ErrorAction 0 -FilterHashTable @{ LogName='Setup' ProviderName='Microsoft-Windows-Servicing' } foreach ($kbid in $kbids) { $events | Where-Object {$_.Message -like "*$kbid*"} | ft -wrap }
Результат совпадает с инвентаризацией пакетов — нужна перезагрузка для завершения установки.
ProviderName: Microsoft-Windows-Servicing TimeCreated Id LevelDisplayName Message ----------- -- ---------------- ------- 5/25/2023 8:24:35 4 Information A reboot is necessary before package KB5026446 can be changed to the Installed state. 5/25/2023 8:18:49 1 Information Initiating changes for package KB5026446. Current state is Absent. Target state is Installed. Client id: UpdateAgentLCU.
Закончив консольные проверки, я открыл центр обновления и увидел там ожидаемую картину — требуется перезагрузка.
Итак, Microsoft действительно форсировала загрузку и установку предварительного обновления. Впоследствии в чате другие участники тоже подтвердили это.
Как Microsoft закатала обновление обратно
Трудно сказать, как долго пропихивали предварительное обновление. Но даже за пару часов его установили миллионам пользователей.
Как только разработчики осознали ошибку, они изменили конфигурацию на серверах Windows Update, пометив обновление действительно предварительным.
Спустя какое-то время после выхода ОС из сна я снова заглянул в центр обновления. Теперь KB5026446 предлагалось скачать и установить. Оно же фигурировало в разделе для необязательных.
Эту же картину увидели люди, у которых в период ошибочной раздачи был выключен компьютер или заблокировано обновление.
Примечательно, что при таком раскладе система перестала предлагать перезагрузить компьютер для установки обновлений. Но фарш уже нельзя было провернуть назад. После перезагрузки обновление полностью установилось и соответственно уже не предлагалось в центре обновления.
PackageName : Package_for_RollupFix~31bf3856ad364e35~amd64~~22621.1778.1.17 InstallTime : 5/28/2023 7:30:06 PackageState : Installed SupportInformation : https://support.microsoft.com/help/5026446 PackageName : Package_for_RollupFix~31bf3856ad364e35~amd64~~22621.1702.1.9 InstallTime : 5/11/2023 0:07:38 PackageState : Superseded SupportInformation : https://support.microsoft.com/help/5026372
Предыдущее накопительное обновление KB5026372 заменено на KB5026446.
Заключение
Как ни крути, эти же фичи прилетят через пару недель, во второй вторник, в рамках финальной версии обновления. Поэтому трагедии тут нет. Но есть устоявшаяся тенденция бесцеремонного обращения с домашними пользователями и безответственного отношения к доставке обновлений. Здесь самое время вернуться к предварительным обновлениям .NET, и я сделаю это через несколько дней в следующей записи блога.
Обсуждение завершено.