Recently, I started experimenting with Windows Server 2016 and I thought to give my new laptop a test for its money by using Hyper-V.
At this point, I automate everything and every research effort normally produces a couple of PowerShell scripts.
My goal is to have what I consider operating system templates, from which I can quickly spin up instances. I also want the instances to be prepared in manner that is good for my development efforts.
For example from the VM I need
- PowerShell remoting enabled.
- File sharing enabled.
- Set the local time zone
- Enable the num lock
Initially I thought Microsoft would be kind enough to provide some sort of automation, where one specifies the host operating system and a magically a new VM spins up. Possible I was dreaming or thinking too much in Azure mode. Instead I figured out that although the Hyper-V PowerShell module is very powerful, it’s also relatively low level. Therefore you need to do many things by yourself.
|So I did and the scripts I created I uploaded into a [gist||https://gist.github.com/Sarafian/507a035636b36694fe2a0bf665236cd1] that I would like to share.|
Create a template
To create a Windows Server 2016 template
New-HVTemplate.ps1 -OSVersion 2016 -MediaPath "14393.0.160715-1616.RS1_RELEASE_SERVER_EVAL_X64FRE_EN-US.ISO"
In the above script, I reference the evaluation version of Windows Server 2016 and
-OSVersion 2016 identifies the template.
The value is used later on from
When creating the template, the user (me) is responsible for all actions on the operating system’s installation process including the Windows Update. The script will
- Setup the necessary artifacts for a temporary VM.
- Let you finish the installation.
- Export the VM to use as a template.
- Remove all artifacts related to this temporary VM.
Create an instance
To create an instance with name
VM201601 based on the above template
New-HV.ps1 -OSVersion 2016 -VMName "VM201601"
The script will
- Import the template into a new VM.
- Start it.
- Capture the VM’s IP and add an entry to my host operating system hosts file.
- Generate a PowerShell script to bootstrap the VM. This script does many of the above described requirements and rename the computer
One of my requirements is to add a certificate into the VM. Since I do not want to pay but I also want proper certificates, I use the free certificate issuer provided by the company’s domain. To automate the process use my CertificatePS PowerShell module:
- On my host operating system, I request a certificate.
- I move the certificate and the chain to the new virtual machine.
$vmName="vmname" $credential=Get-Credential -Message "Local administrator on $vmName" $certificateAuthority="certificateAuthority" $certificate=New-DomainSignedCertificate -Hostname $vmName -CertificateAuthority $certificateAuthority $certificate | Move-CertificateToRemote -ComputerName $vmName -Credential $credential -PfxPassword $credential.Password -MoveChain
That’s it. We can validate the outcome on the VM with this fragment
Get-ChildItem Cert:\LocalMachine\My\ |Test-Certificate
To remove an instance with name
Remove-HV.ps1 -VMName "VM201601"
The script will
- Stop the VM
- Remove the virtual disk files
- Remove the VM