Windows/Powershell/Hyper V
From r00tedvw.com wiki
(Difference between revisions)
(→Clone VM) |
(→Clone VM) |
||
Line 25: | Line 25: | ||
=Scripts= | =Scripts= | ||
==Clone VM== | ==Clone VM== | ||
− | Quick script to clone a VM based on an existing "master". | + | Quick script to clone a VM based on an existing "master".<br> |
+ | issues with this method will be duplication of VM values, such as hostname, sid, etc. Also, this uses VHD differencing, so the master cannot be powered on or it will break the rest of the vms created off it. | ||
<nowiki>param( | <nowiki>param( | ||
[parameter(ParameterSetName="createvm")][int64]$Epoch = [long](Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s), | [parameter(ParameterSetName="createvm")][int64]$Epoch = [long](Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s), |
Revision as of 14:47, 23 January 2019
Install
To Install the Hyper-V Powershell Module (Done on Windows 10 client)
PS> Get-WindowsOptionalFeature -Online -FeatureName *hyper-v* | select DisplayName, FeatureName DisplayName FeatureName ----------- ----------- Hyper-V Microsoft-Hyper-V-All Hyper-V Platform Microsoft-Hyper-V Hyper-V Management Tools Microsoft-Hyper-V-Tools-All Hyper-V Module for Windows PowerShell Microsoft-Hyper-V-Management-PowerShell Hyper-V Hypervisor Microsoft-Hyper-V-Hypervisor Hyper-V Services Microsoft-Hyper-V-Services Hyper-V GUI Management Tools Microsoft-Hyper-V-Management-Clients PS> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Management-PowerShell Path : Online : True RestartNeeded : False
Scripts
Clone VM
Quick script to clone a VM based on an existing "master".
issues with this method will be duplication of VM values, such as hostname, sid, etc. Also, this uses VHD differencing, so the master cannot be powered on or it will break the rest of the vms created off it.
param( [parameter(ParameterSetName="createvm")][int64]$Epoch = [long](Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s), [parameter(ParameterSetName="createvm")][ValidateSet('Win2k16-Master','Win2k12r2-Master','Win2k16GVEUpgrade-Master','Win2k12r2GVEUpgrade-Master','Linux-Master')][string]$BaseImage = "Linux-Master", [parameter(ParameterSetName="createvm")][string]$ComputerName = "win-45mo0eqvg4g", [parameter(ParameterSetName="createvm")][string]$Name = -join($BaseImage, "-", $Epoch), [parameter(ParameterSetName="createvm")][string]$Path = "C:\ProgramData\Microsoft\Windows\Hyper-V\", [parameter(ParameterSetName="createvm")][string]$NewVHDPath = "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\$Name.vhdx", [parameter(ParameterSetName="createvm")][string]$NewVHDSizeBytes = 20GB, [parameter(ParameterSetName="createvm")][int]$Generation = 1, [parameter(ParameterSetName="createvm")][string]$MemoryStartupBytes = 1GB, [parameter(ParameterSetName="createvm")][string]$SwitchName = "External_Virtual_Switch_01", [parameter(ParameterSetName="createvm")][int]$ProcessorCount = 1, [parameter(ParameterSetName="createvm")][int64]$MemoryMinimumBytes = 1073741824, [parameter(ParameterSetName="createvm")][int64]$MemoryMaximumBytes = 2147483648, [parameter(ParameterSetName="createvm")][string]$AutomaticStartAction = "Nothing", [parameter(ParameterSetName="createvm")][int]$AutomaticStartDelay = 1, [parameter(ParameterSetName="createvm")][string]$AutomaticStopAction = "Shutdown", [parameter(ParameterSetName="createvm")][string]$Date = (Get-Date), [parameter(ParameterSetName="createvm")][string]$Notes = "Created $Date" ) function CreateVM { New-VM -ComputerName $ComputerName ` -Name $Name ` -Path $Path ` -VHDPath $newVHDPath ` -Generation $Generation ` -MemoryStartupBytes $MemoryStartupBytes ` -SwitchName $SwitchName } function ConfigureVM { Set-VM -ComputerName $ComputerName ` -Name $Name ` -ProcessorCount $ProcessorCount ` -DynamicMemory ` -MemoryMinimumBytes $MemoryMinimumBytes ` -MemoryMaximumBytes $MemoryMaximumBytes ` -AutomaticStartAction $AutomaticStartAction ` -AutomaticStartDelay $AutomaticStartDelay ` -AutomaticStopAction $AutomaticStopAction ` -Notes $Notes } function DeleteVM { $disk = Get-VMHardDiskDrive -ComputerName $ComputerName -VMName $Name | Select-Object -ExpandProperty Path Remove-Item $disk Remove-VM -ComputerName $ComputerName -Name $Name -Force } function ValidateName { Get-VM -ComputerName $ComputerName | ForEach-Object { if ($_.VMName -eq $Name) { $script:LogOut = "$Date - Failed to create the VM with the name: $Name. A VM already exists with that name." exit } else { return } } } function CloneVHD { #$srcVHD = -join((Split-Path -Path $NewVHDPath), "\", $BaseImage, ".vhdx") $srcVHD = Get-VMHardDiskDrive -ComputerName $ComputerName -VMName $BaseImage | Select-Object -ExpandProperty Path $newVHD = -join((Split-Path -Path $NewVHDPath), "\", $BaseImage, "-", $Epoch, ".vhdx") New-VHD -Differencing -Path $newVHD -ParentPath $srcVHD } function ClearVariables { #$Variables = Get-Variable | Where-Object {($_.Attributes -like "System.Management.Automation.ArgumentTypeConverterAttribute") -and ($_.Name -notin "ConfirmPreference","DebugPreference","ErrorActionPreference","InformationPreference","OutputEncoding","ProgressPreference","PSDefaultParameterValues","VerbosePreference","WarningPreference")} | Select-Object -ExpandProperty Name $Variables = ("Epoch", "BaseImage", "ComputerName", "Name", "Path", "NewVHDPath", "NewVHDSizeBytes" , "Generation", "MemoryStartupBytes", "SwitchName", "ProcessorCount", "MemoryMinimumBytes", "MemoryMaximumBytes", "AutomaticStartAction", "AutomaticStartDelay", "AutomaticStopAction", "Date", "Notes") foreach ($Variable in $Variables) { Get-Variable $Variable | Clear-Variable -Force -ErrorAction SilentlyContinue } } #Set-PSDebug -Off #Set-PSDebug -Trace 2 try { ValidateName -ErrorAction Stop CloneVHD -ErrorAction stop CreateVM -ErrorAction Stop $script:LogOut = "$Date - Created VM $Name" } catch { $ErrorMessage = $_.Exception.Message $script:LogOut = "$Date - Failed to create the VM $Name. The error message was $ErrorMessage" Break } finally { echo $script:LogOut | Out-File C:\logs\vm-script.log -Append } try { ConfigureVM -ErrorAction Stop Start-VM -ComputerName $ComputerName -Name $Name -ErrorAction Stop $script:LogOut = "$Date - Configured VM $Name" } catch { $ErrorMessage = $_.Exception.Message $script:LogOut = "$Date - Failed to configure the VM $Name. The error message was $ErrorMessage ---- Deleting VM $Name due to configuration failure." DeleteVM Break } finally { echo $script:LogOut | Out-File C:\logs\vm-script.log -Append } #Get-Variable | ForEach-Object { $_.Name } ClearVariables