image files, wim files, mdt, pxe, and kms

In an isolated test environment it can be interesting to experiment with available technologies, though some might be questionable (hence the isolated test environment).

Steps to perform:

  1. Rip available .wim files from an OS install dvd
  2. Setup and configure MDT (and optionally WDS server)
  3. Install py-kms as an experiment
  4. Import .wim file into MDT
  5. Target py-kms as part of your task sequence or configure as DNS SRV record
  1. Rip available .wim files from an OS install dvd
<#
.SYNOPSIS
Convert install images from a source DVD to individual .wim files, ready for MDT

.DESCRIPTION
DVDs come ready with multiple images to install in various formats, before importing
into MDT for the purpose of PXE booting it is necessary to obtain individual .wim
files.

.NOTES
Author: Travis Loyd
  Date: 2020-11-08
#>
[CmdletBinding()]
Param (
    # Path to DVD including sources folder
    [Parameter(Mandatory=$true, Position=0)]
    [string]$SourceImagePath = "D:\sources",

    # Target folder where ripped .wim images are stored
    [Parameter(Mandatory=$true, Position=1)]
    [string]$DestinationImagePath = "E:\ISO_Import"
)


# Various install file format styles
$SupportedExtensions = @("esd","swm","wim")
foreach ($Extension in $SupportedExtensions) {
    # Next potential source file
    $SourceImageFile = "$($SourceImagePath)\install.$($Extension)"

    # Skip if not found
    if (-not (Test-Path $SourceImageFile)) {
        continue
    }

    # debug
    Write-Host "Working with '$SourceImageFile'"

    # Loop through images contained within install file
    $Images = Get-WindowsImage -ImagePath $SourceImageFile
    foreach ($Image in $Images) {
        # debug
        Write-Host "$($Image.ImageIndex): $($Image.ImageName)"

        # Form resultant wim file name
        $DestinationName = "$(($Image.ImageName -split " ") -join "_").wim"
        $DestinationImagefile = "$DestinationImagePath\$DestinationName"

        # Handle possible extension types
        switch ($Extension) {
            "esd" {
                dism /export-image /SourceImageFile:$($SourceImageFile) /SourceIndex:$($Image.ImageIndex) /DestinationImageFile:$($DestinationImagefile) /Compress:max /CheckIntegrity
            }
            "swm" {        
                # prep
                $SwmFile = "$($SourceImagePath)\install*.swm"

                dism /export-image /SourceImageFile:$($SourceImageFile) /swmfile:$($SwmFile) /SourceIndex:$($Image.ImageIndex) /DestinationImageFile:$($DestinationImagefile) /Compress:max /CheckIntegrity
            }
            "wim" {
                dism /export-image /SourceImageFile:$($SourceImageFile) /SourceIndex:$($Image.ImageIndex) /DestinationImageFile:$($DestinationImagefile) /Compress:max /CheckIntegrity
            }
        }
    }
}

2. Left up to the reader as an exercise

3. Install and configure docker then:

docker run -d --name py-kms --restart always -p 1688:1688 pykmsorg/py-kms

4. Left up to the reader as an exercise

5. Left up to the reader as an exercise

Posted in Infrastructure.

Leave a Reply