PowerShell: C贸mo instalar Windows a un VHD

En PowerShell, cada ve que pensamos en automatizar cosas, se nos van ocurriendo otras cosas m谩s complejas o interesantes.

Una cosa que siempre me pareci贸 interesante es poder automatizar la creaci贸n e instalaci贸n de las m谩quinas virtuales. Nosotros usamos muchas MVs en laboratorios, pruebas, simulaci贸n de incidentes, etc. Es un proceso que repetimos bastante.

Entonces se me ocurri贸 ponerle cabeza a este proceso repetitivo.

Como ya hab铆amos hablado en un post anterior sobre como trabajar con Hyper-V (enlace al post), voy a evitar la parte de explicar los comandos a utilizar. Solo voy a detallar los que son nuevos:

Lo primero es, comprobar que desde donde estamos ejecutando el script es un host de Hyper-V, en caso de que no sea; que termine el script. En caso de que sea; que nos guarde el nombre de las VMs que ya existen.

Function Install-SO {
Param
(
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()]$ISO,
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()]$VHDX,
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()]$SizeGB,
[parameter(mandatory=$false)][ValidateNotNullOrEmpty()]$Index
)

Con el bloque de c贸digo anterior, empezamos a definir la funci贸n que nos permitir谩 instalar Windows en un .VHDX. Declaramos los par谩metros que vamos a necesitar mas adelante:

ISO 鈥 Donde se encuentra la ISO de instalaci贸n

VHDX 鈥 Donde se va a guardar (y con qu茅 nombre) el .VHDX resultante

SizeGB 鈥 El tama帽o de nuestro disco

Index 鈥 Es la opci贸n de instalaci贸n

Quiero aclarar que el index, es la opci贸n que elegimos al momento de instalar. Es decir, cuando insertamos un medio de instalaci贸n de, por ejemplo, Windows Server nos aparecen varias opciones: Standard, Standard Core, Datacenter, etc. Esas opciones tienen un n煤mero y podemos declararlo si lo conocemos. Como no todos saben cual es el index necesario, agregue unas l铆neas m谩s de c贸digo para que nos imprima en pantalla las opciones y nos permita seleccionar la imagen que nos interesa.

If($Index -eq $null){
    Mount-DiskImage -ImagePath $ISO
    $ISOImage = Get-DiskImage -ImagePath $ISO | Get-Volume
    $ISODrive = [string]$ISOImage.DriveLetter + ":"
    $IndexList = Get-WindowsImage -ImagePath $ISODrive\sources\install.wim
    $IndexList
    Dismount-DiskImage -ImagePath $ISO
    Write-Host "Seleccionar imagen (0 = Salir):" -NoNewline
    $Index = "-1"
    While($Index -eq "-1"){
        $Index = Read-host
        If ($Index -eq "0") {
            Write-Host "Terminando..."
            Exit
        }
    }
}

En el bloque anterior indicamos que si no declaramos el par谩metro index (o sea, es $null), ejecutemos lo que esta dentro de la condicional; que b谩sicamente es 鈥渓istar鈥 las opciones de imagenes que trae la ISO para que podamos imprimirlas en consola y mediante la funci贸n Read-Host, ingresemos la opci贸n correcta.

Esto es lo que se tendr铆a que ver al seleccionar la ISO de Windows Server 2012 R2:

El resto del c贸digo es bastante claro:

Mount-DiskImage -ImagePath $ISO
$ISOImage = Get-DiskImage -ImagePath $ISO | Get-Volume
$ISODrive = [string]$ISOImage.DriveLetter + ":"

Generamos el VHD.

$VMDisk = New-VHD 鈥揚ath $VHDX -SizeBytes $SizeGB
Mount-DiskImage -ImagePath $VHDX
$VHDDisk = Get-DiskImage -ImagePath $VHDX | Get-Disk
$VHDDiskNumber = [string]$VHDDisk.Number

Creamos la partici贸n.

Initialize-Disk -Number $VHDDiskNumber -PartitionStyle MBR
$VHDDrive = New-Partition -DiskNumber $VHDDiskNumber -UseMaximumSize -AssignDriveLetter -IsActive | Format-Volume -Confirm:$false
$VHDVolume = [string]$VHDDrive.DriveLetter + ":"

Volcamos la imagen de la ISO al disco.

Dism.exe /Apply-Image /ImageFile:$ISODrive\Sources\install.wim /index:$Index /ApplyDir:$VHDVolume\

BCDBoot.exe $VHDVolume\Windows /s $VHDVolume /f BIOS

Dismount-DiskImage -ImagePath $ISO
Dismount-DiskImage -ImagePath $VHDX

}

Ya finalizado, para ejecutar la funci贸n tendriamos la siguiente l铆nea:

Install-SO -VHDX C:\VMS\WS2012R2.vhdx -ISO C:\ISOS\WindowsServer2012R2.iso -SizeGB 42GB

Donde C:\VMS\WS2012R2.vhdx es la ruta en la que se va a guardar el disco con la instalaci贸n, C:\ISOS\WindowsServer2012R2.iso esla ruta donde se encuentra la imagen ISO y 42GB el tama帽o del disco.

Dejo toda lafunci贸n compartida desde Gist:

Saludos,

Comments