Ottenere parametri Hyper-V Automatic Start Action e IP address via Powershell

Ciao a tutti!

Oggi avevo un po' di tempo e ho deciso di sistemare le mie macchine virtuali Hyper-V. Nel corso degli anni le avevo create e configurate, in particolare per ottimizzare le prestazioni in base di boot avevo deciso di utilizzare questo setting di Automatic Start Action:

image

Semplicemente, configurandolo si fa in modo che quando l’host fisico si riavvia, ogni VM venga avviata con un ritardo differente in modo che non “litighino” tutte in contemporanea per ottenere le risorse necessarie. Inoltre è possibile decidere se far avviare sempre le VM o solo quelle che erano accese quando si era riavviato l’host fisico.

Ero stato molto diligente e avevo configurato ogni VM ad avviarsi con intervalli multipli di 30 secondi, in ordine di importanza. Ora siccome sono passati alcuni anni, ho sicuramente distrutto e cancellato molte VM e probabilmente creato alcune nuove senza seguire bene la “regola”. Pigramente, non avevo voglia di andare a cliccare sulle proprietà di ogni VM e andare a leggere e annotare il valore…

Mi sono detto..ci sarà un modo per leggerlo velocemente? Certo che c’è Sorriso

Il comando powershell è molto semplice ma non lo trovate in giro nei blog su internet quindi lo condivido con voi con grande piacere.

Get-VM | sort AutomaticStartDelay | ft name,AutomaticStartAction,AutomaticStartDelay –Autosize

L’output è eloquente:

image

(con facilità quindi sono riuscito a beccare una VM configurata male - Stockolm - e molte altre senza AutomaticStartDelay :)

 

A questo punto mi sono chiesto…già che sto facendo l’inventario delle mie VM sarebbe utilissimo sapere gli indirizzi IP che ho dato ad ognuna! Vediamo se possiamo estendere la ricerca anche a questo attributo.

Il comando c’è ed è il seguente

(Get-VMNetworkAdapter –VMName “nome della VM”).IpAddresses

ma ci sono due problemi

1) il comando lista TUTTI gli indirizzi IP della VM compresi quelli link-local IPv6. Forse non utilissimi al nostro scopo

(Get-VMNetworkAdapter -VMName lisboa).IpAddresses

10.10.0.102
fe80::6090:5403:6ba7:4b0f

2) il comando funziona solo se la VM è di nuova generazione.

Quindi per le mie VM, poiché sono praticamente tutte vecchie e di Generazione 1, il comando non è utile.

 

Tocca quindi ricorrere alla vecchia scuola delle query WMI

Qui non ho re-inventato la ruota ma ho fatto affidamento allo script di Taylor Brown

$vm = Get-WmiObject -Namespace root\virtualization\v2 -Class `
    Msvm_ComputerSystem -Filter {ElementName= 'Nome della VM' }

$vm.GetRelated("Msvm_KvpExchangeComponent").GuestIntrinsicExchangeItems | % { `
        $GuestExchangeItemXml = ([XML]$_).SelectSingleNode(`
            "/INSTANCE/PROPERTY[@NAME='Name']/VALUE[child::text()='NetworkAddressIPv4']")
        if ($GuestExchangeItemXml -ne $null)
        {
      $GuestExchangeItemXml.SelectSingleNode(`
            "/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child::text()").Value
        }   
    }

 

L’output di questo script è semplicemente l’indirizzo IPv4 della VM richiesta.

Ora per combinare l’output di questo comando con quello del Get-VM iniziale bisogna definire qualche struct customizzata e ciclare l’esecuzione per ogni VM presente sull’host. Non vi annoio con i passaggi da puro sviluppatore…ma vi metto a disposizione il mio script completo che ho pubblicato qui su Script Center.

https://gallery.technet.microsoft.com/scriptcenter/Get-Hyper-V-virtual-0c6f2064

Ah già che c’ero ho aggiunto una altra query WMI (stessa sintassi) per la versione del sistema operativo della VM Sorriso

Il risultato è grandioso :

image

Nota bene 1: le Query WMI funzionano solo se la VM è accesa! (vedi apollo, tardis.. dove non è prodotto output)

Nota bene 2: le Query WMI funzionano ovviamente solo se la VM è Windows (vedi trixbox, ubuntu..)

Il Get-VM invece, poiché legge la configurazione nell’host Hyper-v e non direttamente “dentro” alla VM funziona in ogni caso.

Link utili

Grazie a tutti e alla prossima!

Stefano Gagliardi
Sr. Support Engineer
Microsoft Enterprise Platform Support