[CmdletBinding(SupportsShouldProcess=$true)] Param() # User to log in as on the VM host $USERNAME = 'dustin' # VM host name/IP address $SERVER = 'atria' # List of virtual machines to start $TO_START = @( 'Rigel', 'Bellatrix' ) # SSH public key of the VM host, in PuTTY registry format $HOST_KEY = @' 0x10001,0xbb0ae72e54993cdef1f0040f0a1ef78e86f030e00d14c80534450d097117d08aee 61c60d8d85372e719691186ec6c64b0bf7de8c2bdbf61b3cc0b86252b09bcc003133133d85d0 edf5cca5a1e82aa18711a9135062448633a7b9eb164c7ab41df1c7283a19c7e010ffdbba26f7 75366aa8b01fd4681e7d234b592f07f43668057d96d605cb54d7825bc438ae433bc42f8579a9 652e7ba841fcedec8e9a6718a82bc14d71bf22a7261f2c035abc4ca1460ccadee21da9077d6d fd1880ea26012d2cfd2e3bbcdaebe3df1c78115b1c2302f99363ca30c0ef31d612a8a6f870d8 60752e8633ad5749d7d66e6028420a4d4c262d0fb7abe0291a657b55cf490e4873 '@ # Private key to use to authenticate to the VM host $PPK = @' UHVUVFktVXNlci1LZXktRmlsZS0yOiBzc2gtcnNhDQpFbmNyeXB0aW9uOiBub25lDQpDb21tZW50 OiBsb2NhbHN5c3RlbUBhcmN0dXJ1cw0KUHVibGljLUxpbmVzOiAxMg0KQUFBQUIzTnphQzF5YzJF QUFBQUJKUUFBQWdFQXpyQVlwRjZ6QWMvZUtvWmZJeWpsczJWc0hPM2JtSWFiN3h5ZA0KZkpPL0dG VzdUYlRhSVpLamMzdEVkZmZCSmZTbFB0QXhwUVFqNmNPbW9mOTVvazFpMzdMNlBEak8vbE9qTStJ aw0KalNFNUN1QU5zN3FyTWNZMEgxMzNkN0tlRWt4dTVmNTgyWktmdmtrRTludDhaY20xenB6TlhY UHZCY29IMmVlVg0KQ3d6QTdDelc1azNuN3dVSFNCYktoeHB4VFp2RnZ1a25nWkpxUVR0V1V3eSsy OUtkcmhqZEdZcWV0QUJ4dXZkcQ0KQldoWEl1WWtqTG1RR2lrZmxERGk0MmFLa1pmVS9qR00zYVVD Y0RES3NXTjFRV0ZrOFYxS0FySklzQU9PVVVsSQ0Kckl1OTI4TUo3SU41S1h2QTJhMmphZlNrVEZw ZklPZG9QblhoZ2liTFdOQXJ0citTb01BeUl3Um10WG5WenlCdg0KWWhzZ2xybVcyM2VIWFc0MHMw R21zK0R5WHhIMXJhS0N2MGZtK0JFelF3dDlpR25uSUkyOU9TR1J1TmVRUXFhKw0KdE5WVlBEUDBJ UmhaUkdnMWt3Qjh0QTQvVTZGS1R3TEgyUDRMVm05VGNkejk4STRESmRZb2Z4ZG14cktvQXoySA0K c3BtYitoM2VzckxkY0hRbjBFeCtTNkJxalUybGQrd2YvTnJZVHhOZlQycjMyRC95VFNTaEdLRHFW ZGJTNFlaRQ0KTHlCUDJwUUFUTVNHUktsNnNlb1JvZVpMQkpFM2F2MVBoaGpMbTNpT1VrNVo0Z1Bk dXhVMTg3UlEvRGs5UEZObw0KSXF0L2wrYUZTZzR4Q0xEdXl2MEQ4Z3M5OWRjdjRWSy9nZWsyWlhD anV2RlFYNHU5NGZhbE9ieE5NSC82YVhzeQ0Kd3JwbDhHcz0NClByaXZhdGUtTGluZXM6IDI4DQpB QUFDQVFDOTdlMGhhOGNXYS95Vng1V3htelB3OVdwRUdOZWc2bVhHOTdOUDRiYUZFSUthYnRaSVhU eEFtc2xKDQp6dWpXeFNJNXVHVDRnRmhhUlJXcG5xY2ZoV0hHcEhjK1FncFJmVW5jcGtzWjV5MS9u WFJmOTZRN2s0blhvblN6DQpMb05xd3NiRmdoSGNzRC9EblF0NnRxbXBwSms2WnBNelIvQm1MMFY4 SU9uU3pYTUNpaEdWWEZpV2MxTE1uMUpTDQpvcTFPUEIxKy84TndKYTIvWnZWaEVxR0x1cDY3cUNV ZVk3UnVEajcrMVlRRStCaTRTUnFxMUFmZ3NDcmJNOWRwDQpMY3R4Q0EvVTA1WXpkUWtvMHVQRm1h b0V1bHpDSGwrdmMyVmplT09rcERUeGxTc0JTM0RuTExTRy9Cai9ZVW9PDQpWbTEybUR1OVh3WFlo LytvQi9raExmNm43azlob2ZTQXJNMy9NYjRtSGl1emdXeTZVSUNBMXVRMmVPVGRsY2NsDQpPSFI4 T1FoU09CY0lHSXB0SEF1MUxCcVF4MEkyanJEY1F2RDRjZVVUL0VBclh5QldqVFZiMElDODhEeUpq eVNFDQpMZGNJS3ZVSzJHTzNCRGZKS09RMzBiNnVLNlJBN09qbUlOMUF6Lzk3TnYvbm12TUdwS0RW QndyazBqb3hWS2ZEDQo1c1hGNXpYUTBtQ2NhTm9oaXphNzlFOGZ0UittWUxnc0NWVEhScVdtMSt1 MXI5NC9LWHBqU0Q0V05EaTRCb1hVDQpVMjJUeG5QL0pEc3U2YW9HaERuZVNlVDI0NnVEQkhwM1Jl MVIrTnRvOXFRSitUcjIxUmJFeWhnK2trSlN2WmptDQpiSUMwU3BjYi9xbDVoUFhsTXVLcEJKZlJX c29vd2M3SWc5WTNTdWhNbXpjUEJkTDhIUUFBQVFFQTY2R0NTOEIxDQpoTm5yOXlCT0FCMGNmdDRn SDNMZFAwUlJDYW1WSDlvWTFlNDh1Z1hzekI4MGthMk11cTZXUmx6QUsyMmpoWXBlDQpQN242VUE5 ZmI3WktBdHZEeDh3enpPaHhQMy83OUdjVXdUL3hXb3NFVS83MWZJaXBYOFp2ZWF3K3BGdVRKV0Jz DQptb0NUQmk5SnUybjAycEswS0ZOVS9weURnaWt1T2ZZUno2QWhHQnROUkF3M3Jsb2tuZ0crQldq eFpOWi9iZGVFDQp5UWJ0TXNmbGZTbTBOeVIzcys1a3Rxa3c2ejluc1FmSk9KMHFjMnI0amI2cXVn eUFQYk5HSDdaelRwcVFLMVkyDQprVWY3Vmt3ZC9HK3ZUUVRDSDh1VmVRd2wyYnM1VGwrOU9ZRlht cFpoUU1uUXpSZjg4blcrQk9VR0d3WFFkdFAxDQozTjlCQzVURERJMDRkUUFBQVFFQTRJNFVzVTJi TDhzVUNIbmYwZThKMUE3RnVZV1FNdWhENTlHVVhnTHNPak1YDQpiemFVOTZtWURpMnRaSlByTEpV bEEwUFRGdklQL2NablM3VEwySFE1cG54cVZ4QUd3d3RBdzFUN0ZTTHlPTktHDQpqNVFWQjFjek56 dlhDZWYveHJxK3FIVWVzQ1NpbnpjUHhzbDBXemljSnJzV3Q1VFhKMXNJREZOQXJ4VzZ0eDJaDQpP bDlRckRrUkFqcUxjRVdrNWw5aTdTQkxLT3REZlNhK3d0MnBrUENIUms4ZHVuSnRickhsNktvQVV2 R2lEN0tiDQowMmZwak1UYW1BYWNaZUlsemtiODluQjRVM2lEQ2hXSy84UGJ0bTNiL09mQTFqd0I4 eEx3dmw2UXpsSXBIMVZqDQp1WjNnTGxIdUNrbkoxRFZxNEVnbithZkxUSmVrSE9JZ1hVdCtZNzVw WHdBQUFRQTZHZXVIQmhxSzN2YWpBd1g0DQpGa1BMSW9vdUtYcWxLcHB2TmJvaFcrUVc1UjhuOXZm T09OT2pMOGVrN2tvSWtObXgwT0FxUnQ3azd3ZGpNd3NBDQpzblBtMWl3RnN3dXppUnRZcTN1UlR4 M3N5OTY2eE1yQ0ozTjZsTTVka2V3OVI4Q0FFNFg0SFFwWWd0M3dwVVlYDQowamxFNmNSL0xGUC9M czh6NWFuZVhjY0tHQnpscFpsN2xKVUd5RXRtLzROa2d4OXAvYmI5ZkN1MVArRXZ4Z0V3DQpqbnYr TkYzYWh1SGx1WGx3TWkvdUFSWTIvcGhxemtSbXFJb2ZjQ2l2a0dlV0VvRFBHR2FvNTg1OVNBZzll MjMyDQpyRWhCcVZlTlc2ZmhOaXpsNHR1dkl0TTlTTEQ2M2lwZmprK1JrQmNTeWNOYnJZVHN0RkZL Ykl3OEQrSDJXa29GDQpKU1FaDQpQcml2YXRlLU1BQzogNjI2ZDQ5YTQwOWNiZGExMzhkNTNiMzZh MGFkNjdjOTRkYWNlMGQ4Nw0K '@ #=============================================================================# Function Save-HostKey { Param( [Parameter(Mandatory=$true)][String] $Hostname, [Parameter(Mandatory=$true)][String] $Pubkey, [Int] $Port = 22, [String] $KeyType = 'rsa2' ) $path = 'HKCU:\Software\SimonTatham\PuTTY\SshHostKeys' if (-not (Test-Path $path -PathType Container)) { New-Item -Type Container -Force -Path $path } New-ItemProperty -Path $path ` -Name "${KeyType}@${Port}:${Hostname}" ` -Value $PubKey ` -PropertyType String ` -Force ` -ErrorAction Stop ` | Out-Null Write-Verbose "Saved $KeyType key for ${Hostname}:${Port}" } Function Save-TempPpk { Param( [Parameter(Mandatory=$true)][Byte[]] $KeyData, [String] $Path = ${env:TEMP} ) $filename = Join-Path $Path ("{0}.ppk" -f [Guid]::NewGuid()) Set-Content -Path $filename -Value $KeyData -Encoding Byte ` -ErrorAction Stop Write-Verbose "Wrote private key file $filename" return $filename } Function Main { Save-HostKey $SERVER ($HOST_KEY -split '\s+' -join '').Trim() $commands = $TO_START | ForEach-Object { "start $_" } $keyfile = Save-TempPpk ([Convert]::FromBase64String($PPK)) try { Write-Output $commands | & ${env:ProgramFiles(x86)}\PuTTY\plink.exe ` -i $keyfile ` -l $USERNAME ` -batch ` $SERVER ` virsh -c qemu:///system } finally { Remove-Item -ErrorAction Stop $keyfile Write-Verbose "Removed $keyfile" } } Main