Проверка присутствия пакета обновления в системе перед установкой

    Установка пакетов обновлений для Windows может происходить как в автоматическом режиме службой Windows Update, так и в ручном режиме через Windows Update Stand-alone Installer (WUSA) — Автономный установщик обновлений из msu-файлов. Кроме WUSA, обновить ОС также можно с помощью Deployment Image Servicing and Management (DISM) — Система обслуживания образов развёртывания и управления ими. Используя DISM можно устанавливать обновления на не только из msu-фалов, но и из cab-файлов. Чтобы получить cab-файл пакета обновления, нужно скачать с сайта Microsoft нужный msu-файл и распаковать его запуском с ключом /extract. Замечено что установка пакетов обновлений в виде cab-файлов с помощью DISM происходит быстрее чем из msu-файлов с помощью WUSA. Я выбираю DISM для работы с обновлениями Windows, поэтому дальнейшее описание приведено для неё.

    Многие системные администраторы собирают свои «коллекции» пакетов обновлений, запуская их установку в определённой последовательности из командного файла. Но иногда, обслуживая незнакомые компьютеры, точно неизвестно какие обновления установлены, а какие — нет. Если запустить установку всех обновлений из длинного списка, то при наличии некоторых обновлений в образе ОС система DISM всё равно установит их «поверх». Чтобы избежать напрасной потери времени в моём скрипте используется «функция» которая проверяет устанавливаемый пакет обновления на его присутствие в ОС. В коде скрипта, для примера, выполняется установка обновлений KB3177467 (Servicing stack update) и KB3125574 (Convenience rollup update). Также происходит автоматической определение разрядности ОС, но это не относиться к теме вопроса.

    Скрипт:

    @echo off
    set arch=x64
    if "%PROCESSOR_ARCHITECTURE%" == "x86" if not defined PROCESSOR_ARCHITEW6432 set arch=x86
    echo The most important updates after SP1 (Convenience rollup) %arch%
    echo -------------------------------------------------------------------------------
    echo Get packages list. Please wait...
    dism /English /Online /Get-Packages > "%TEMP%\packages.txt"
    echo Servicing stack update: KB3177467
    call :exist .\%arch%\Windows6.1-KB3177467-%arch%.cab ||^
    dism /Online /Add-Package /PackagePath:.\%arch%\Windows6.1-KB3177467-%arch%.cab /Quiet /NoRestart
    echo Convenience rollup update: KB3125574
    call :exist .\%arch%\Windows6.1-KB3125574-v4-%arch%.cab ||^
    dism /Online /Add-Package /PackagePath:.\%arch%\Windows6.1-KB3125574-v4-%arch%.cab /Quiet /NoRestart
    echo -------------------------------------------------------------------------------
    pause
    :exist
    dism /English /Online /Get-PackageInfo /PackagePath:%1 | find "Package Identity" |^
    findstr /g:/ %TEMP%\packages.txt > nul && exit /b
    exit /b 1
    

    Файлы и папки:

    Файлы пакетов обновлений здесь не прилагаю, так как указанные в скрипте взяты для образца. По месту нахождения скрипта должны быть созданы папки x64 и x86 в которые нужно разместить нужные пакеты обновлений. Сам файл скрипта можно сохранить в кодировке ANSI если не использовать кириллицу для вывода информационных сообщений. А если хочется видеть русский текст, то нужно cmd-файл сохранить в кодировке OEM 866.

    Описание работы:

    Перед началом установки система DISM запрашивет (/Get-Packages]) у ОС список уже установленных пакетов обновлений и сохраняет его в текстовом файле во временной папке %TEMP%\packages.txt. В дальнейшем перед началом установки каждого пакета обновлений происходит обращение к «функции» :exist с передачей в качестве аргумента — пути к устанавливаемому пакету для проверки. «Функция» :exist извлекает (/Get-PackageInfo) из проверяемого пакета служебную информацию, в которой отыскивается строка «Package Identity». Эта строка «по конвееру» передаётся следующей команде поиска, которая ищет данную строку в сохранённом файле %TEMP%\packages.txt. По результатам поиска возможны два варианта:

    • Если обновление не обнаруживается установленным в системе, то «функция» :exist выходит с кодом %ERRORLEVEL% 1, и в этом случае происходит установка (/Add-Package) пакета системой DISM. После установки обновления (если пройдёт успешно) — обнуляется %ERRORLEVEL% и может использоваться для следующего запуска «функции» :exist;
    • Если обновление обнаруживается установленным в системе, то «функция» :exist выходит с кодом %ERRORLEVEL% 0, и в этом случае установка пакета обновления не происходит, а скрипт переходит к обработке следующего пункта по списку. Необходимости обнулять %ERRORLEVEL% нет.

    Возможные проблемы:

    Проверка присутствующих в ОС обновлениях выполняется только по полю «Package Identity», статус не проверяется! В нормальном состоянии пакеты имеют статус Installed (Установлен), но возможны ошибочные состояния присутствующих в системе пакетов обновлений: Superseded (Заменён), Not Present (Отсутствует), Staged (Промежуточное). Состояние присутствующих пакетов можно посмотреть открыв файл %TEMP%\packages.txt, созданный в процессе работы скрипта. Если «ошибочных» состояний нет, то проблем быть не должно: установиться то чего нет, и пропустится то что уже установлено.

    Использование данного скрипта для обновления ОС недостающими пакетами значительно экономит время!

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 10

      0
      Спасибо за статью, но зачем? В офисе комп пашет 8 часов в день. За это время винда сама отлично обновится в фоне. Я работаю в сервисе и при переустановке винды — мы накатываем все обновления. Обнова десятки занимает не больше часа вместе со скачиванием, а как правило ещё скорее. Сколько можно выиграть с вашего варианта и есть ли смысл?
        0
        Вы видимо никогда не разворачивали пару десятков компов за сутки. При условии подготовки в своем офисе, где вся техника разом не встанет физически, ценишь любое уменьшение времени установки.
          0
          Так может стоит разворачивать уже установленный образ системы?
          Мы так с учителем еще в школе делали. Настроили систему раз и развернули потом быстро много много раз на всех машинах.

          Плюс ко всему есть возможность накатывать на машины обновления через политики, если нормально организован домен.
            0
            Уже установленный образ, к сожалению, помогает только когда компьютеры более-менее одинаковые по характеристикам. По результатам закупки у организации мне тогда досталось 35 разных машин с установленной windows 7 (шел 2016 год) и без обновлений. Сносить конечно можно, но я помню во что превращается зачастую установка драйверов у фирменных лэптопов и рабочих станций.
            Но если компьютеры одинаковые — sysprep наше все, конечно.
              0
              Для установки на разные компы хорошо подходит Acronis, он позволяет полностью клонировать диск включая установленные программы. Правда заморочка с драйверами остается. Если заново ставить винду так и так их сверху приходиться накатывать
            0

            Если нужно накатить Винду на 20 компов, то лучше и быстрее использовать sysprep. Можно сразу и софт добавить и обновы ставятся 1 раз, а не на каждый комп. В десятке, как выше заметили, все ещё проще, т.к. в ней обновы кумулятивные.

            +1
            Решается проблема не при переустановке, а при накатывании обновлений на компьютер, где неизвестно состояние обновлений, но нужно обновить до актуального состояния.
              0
              так а почему винда сама не может это определить и поставить обновление?
                0
                Не совсем понял вопрос. В контексте темы — вручную запускается процесс установки обновления, который проверяет есть ли это обновление в установленных или нет, на что тратится некоторое время и так для каждого обновления, вне зависимости от того, установлено оно или нет. В описанном скрипте сначала берётся список всех установленных обновлений, затем формируется список для доустановки и запускается процесс установки отсутствующих обновлений, что экономит время, иногда значительное.
            0
            Может, проще поднять WSUS и компьютеры направить туда? Домен для этого не требуется.

            Only users with full accounts can post comments. Log in, please.