OSD: Оффлайн обновление WIM образов

Думаю, многие как-то пытались решить вопрос по актуализации обновлений в существующих образах.

 
Существует несколько способов:

  • Build and Capture
  • Использование функционала SCCM 2012 уже сегодня, обновляя образы на тестовых стендах
  • Использование WAIK
  • Использование утилиты DISM и скриптов

Как раз последний способ и будет описан в данной статье. Этот скрипт создаст функцию Add-WimPackages. Данная функция использует утилиту DISM и Imagex, которые входят в комплект WAIK 2, поэтому скрипт будет проверять наличие WAIK 2.0. Итак, что делает данный скрипт? После запуска данного скрипта вам необходимо будет ввести команду «Add-WimPackages -Path <Полный путь до WIM файла> -PackagesPath <Путь до каталога с обновлениями>». В качестве пути к каталогу с обновлениями необходимо задать папку, куда SCCM загружает обновления. Если вы не используете SCCM, как точку обновлений, а используете WSUS, то вы можете указать каталог с вручную скачанными обновлениями в формате .msu или .cab. Скрипт необходимо запускать с привелегироваными правами.

add-wimPackagescmdlet.ps1


function Add-WimPackages {
param([parameter(Mandatory = $true)][string]$Path, [parameter(Mandatory = $true)][string]$PackagesPath, [string]$MountDir)

# Set variables

$tools = "$env:ProgramFiles\Windows AIK\Tools\$env:PROCESSOR_ARCHITECTURE"
$imagex = $tools + '\imagex.exe'
$dism = "$env:windir\system32\dism.exe"
$wid = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$prp = new-object System.Security.Principal.WindowsPrincipal($wid)
$adm = [System.Security.Principal.WindowsBuiltInRole]::Administrator
$IsAdmin = $prp.IsInRole($adm)

# Check conditions

if (!($IsAdmin)) {write-host 'Insufficient access rights.' -foregroundcolor red; return}
if (!(Test-Path $Path)) {write-host 'Path to WIM file is incorrect.' -foregroundcolor red; return}
if (!(Test-Path $PackagesPath)) {write-host 'Path to Packages is incorrect.' -foregroundcolor red; return}
if (!(gwmi -Namespace root\cimv2 -class WIN32Reg_AddRemovePrograms | ? {($_.DisplayName -eq 'Windows Automated Installation Kit') -and ($_.Version -ge '2.0.0.0')})) {write-host 'You must install Windows AIK 2.0 or later.' -foregroundcolor red; return}
if (!(Test-Path $dism)) {write-host 'DISM utility not found.' -foregroundcolor red; return}
if (!(Test-Path $imagex)) {write-host 'IMAGEX utility not found.' -foregroundcolor red; return}
[xml]$imagexxml = &$imagex /INFO $Path /XML
if ($imagexxml.toString() -ne '#document') {write-host 'WIM file is incorrect.' -foregroundcolor red; return}
if (!($MountDir)) {$MountDir = "$env:SystemDrive\"}
if (!(Test-Path $MountDir)) {write-host 'Mount directory is incorrect.' -foregroundcolor red; return}

# Process script

$MountDir = $MountDir + "\Mount\"
$Packages = gci $PackagesPath -Recurse | ? {($_.Name -like "*.cab") -or ($_.Name -like "*.msu")}
foreach ($image in $imagexxml.SelectNodes("WIM/IMAGE")) {
[string]$index=$image.index
$Major = $image.SelectSingleNode("WINDOWS/VERSION/MAJOR")."#text"
$Minor = $image.SelectSingleNode("WINDOWS/VERSION/MINOR")."#text"
if ($Major -eq $null) {write-host "Image is not Microsoft Windows operating system" -foregroundcolor yellow}
if ($Major -lt '6') {write-host "Image index $index is cannot be updated in offline" -foregroundcolor yellow}
else {
write-host "Updating Image: $index`nImage name: "$image.SelectSingleNode("NAME")."#text" -ForegroundColor green
$Mount = "$MountDir\$index\"
$job = New-Item -Path $Mount -ItemType Directory -force
$job = &$dism /Mount-Wim /WimFile:"$path" /Index:$index /MountDir:$mount /English
if ($image.SelectSingleNode("WINDOWS/ARCH")."#text" -eq '0') {$arch = 'x86'}
elseif ($image.SelectSingleNode("WINDOWS/ARCH")."#text" -eq '9') {$arch = 'x64'}
else {$arch = 'ia64'}
$job = &dism /Image:"$Mount" /Get-Packages /English
$exists = $job -split "~" -split "_" | ? {$_ -like 'KB*'}
foreach ($Package in $Packages) {
$PackagePath = $Package.FullName
$Package = $Package.Name
if (!($exists -contains ($Package -split "-" | ? {$_ -like "KB*"})) -and ($Package -like "*windows$major.$minor-kb*$arch.*")) {
$job = &$dism /Image:"$Mount" /Add-Package /PackagePath:"$PackagePath" /English
if ($job -match '0x800f08') {write-host "The package $Package is not applicable to this image or cannot be added in offline." -ForegroundColor yellow}
if ($job -match 'successfully') {write-host "The package $Package applied succesfully." -ForegroundColor Green}
}
else {Write-Host "The package $Package is not applicable to this image or already exists." -ForegroundColor yellow}
}
write-host "Unmounting image." -ForegroundColor green
$job = &dism /Commit-Wim /MountDir:"$Mount" /English
$job = &dism /Unmount-Wim /MountDir:"$Mount" /commit /English
if ($job -contains "The operation completed successfully.") {Remove-Item "$Mount" -Recurse; write-host "The image $index updated successfully." -ForegroundColor green}
else {write-host "The image $index is not unmounted.`nStop processing image." -ForegroundColor red; return}
}
}
if (Test-Path "$MountDir") {Remove-Item "$MountDir" -Recurse}
Write-host "All images successfully updated." -ForegroundColor green
}

Данный способ не является наилучшим и уступает Build & Capture, т.к. есть обновления, которые можно установить только в онлайне и работает только для операционных систем Windows Vista SP2 и выше. Также не стоит забывать, что есть еще обновления в формате .exe, но всё же лучше, чем ничего.

Реклама

Детали bobgreen84
System Center Products Specialist

2 Responses to OSD: Оффлайн обновление WIM образов

  1. PUNK says:

    Больше постов больших и интересных! 🙂

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: