Функция для загрузки обновлений из Microsoft Update Catalog

На прошлой неделе, я случайно сделал функцию, загружающую файлы обновлений из Microsoft Update Catalog. Зачем это нужно? Как её применить в реальной жизни?
Например, вы собираете образ операционной системы для последующего его распространения. Наверняка, вы хотите, чтобы этот образ содержал в себе уже все доступные на сегодняшний день обновления: это поможет не только повысить безопасность машин на этапе установки но и сократит время настройки системы после развёртывания.
Для Windows Server 2012 R2 и более ранних ОС, вам придётся загрузить и интегрировать несколько десятков обновлений, но вы не можете быть уверены, какие именно исправления требуются для вашего установочного образа (ISO Windows Server 2012 R2 выпускался, по крайней мере, 3 раза). Единственный точный путь определить это — установить компьютер с этого образа, подключить к Интернету и проверить доступные обновления через Microsoft Update.
В PowerShell обновления проверяются так:

После этого, $SearchResult будет содержать список обновлений, которые нужны вашей системе.

Для того, чтобы интегрировать обновление в установочный образ, нужно как-то получить его .msu- или .cab-файл. К сожалению, из объекта $SearchResult невозможно извлечь ссылки для загрузки таких файлов (во всяком случае, мне об этом ничего не известно). И вот с этим на и поможет функция Get-WUFilebyID:
Во первых, мы извлечём список идентификаторов обновлений из объекта $SearchResult:

А затем, по очереди, передадим эти идентификаторы в функцию:

В параметре -SearchCriteria нужно указать для какого продукта загружать обновления.

В итоге, вы получите все файлы обновлений (по умолчанию, в текущем каталоге. Переопределяется параметром -DestinationDirectory) и сможете их интегрировать при помощи командлета Add-WindowsPackage

Если вы не хотите загружать файлов, а только получить ссылки на них, используйте переключатель -LinksOnly.

Функция покрыта тестами и доступна на GitHub. Вопросы и предложения приветствуются: вы можете либо оставить их прямо здесь в комментариях, либо на GitHub в разделе Issues.

Leave a Reply

Your email address will not be published. Required fields are marked *