Invio pressione tasti, inserimento testi e movimenti mouse su macchina virtuale Hyper-V

Sono solito lavorare con altre soluzioni, ma da un po’ di tempo a questa parte ho deciso di prendere in considerazione l’hypervisor di MS, che in alcune circostanze può essere un prodotto estremamente interessante.
Ho deciso quindi di pubblicare articoli per ogni problematica mi trovo a dover risolvere, riportando qui alcuni appunti e le modalità con cui ho risolto.

Problema

In questo caso specifico, per conto di un cliente ho convertito un vecchio server contenente un gestionale economico su sistema operativo Linux Red Hat Enterprise 2.4 e la scelta è ricaduta su Hyper-V per alcune motivazioni che non sto a riportare in questo articolo.

All’avvio della macchina virtuale, è necessario inserire una password per permettere il caricamento del gestionale e si attiva l’accesso client con un ulteriore comando.
Il cliente necessita di un avvio totalmente automatico, per mancanza di tempo e competenze non ha la possibilità di gestire manualmente l’avvio del server, dovevo quindi trovare il modo di automatizzare alcuni passaggi tramite uno script Powershell.

Soluzione

Dopo l’avvio della macchina virtuale, metto in pausa lo script per un tempo compatibile con il boot della stessa:

Start-VM -Name "nome macchina virtuale"
Start-Sleep -s 120

A questo punto, pausa terminata e macchina virtuale in attesa dell’inserimento della password, invio una serie di caratteri\caratteri speciali:

$VMName = "nome macchina virtuale"
$VMCS = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_ComputerSystem -Filter "ElementName='$($VMName)'"
$keyboard = $VMCS.GetRelated("Msvm_Keyboard")
$keyboard.TypeKey(0x11) | out-null

In nel caso riportato sopra viene effettuata una pressione del tasto CTRL.
A questo punto sarà possibile simulare la pressione di una serie di tasti in rapida successione impostando una pausa tra una pressione e l’altra:

$keyboard.TypeKey(0x50) | out-null
sleep -Milliseconds 300
$keyboard.TypeKey(0x41) | out-null
sleep -Milliseconds 300
$keyboard.TypeKey(0x53) | out-null
sleep -Milliseconds 300
... etc ...

Qui è possibile trovare tutti i codici per generare la pressione del tasto equivalente:
https://docs.microsoft.com/it-it/windows/win32/inputdev/virtual-key-codes?redirectedfrom=MSDN

Nel mio caso avevo bisogno di inviare pressioni di tasti speciali, ma nel caso vada semplicemente inserito del testo, è possibile utilizzare una funzione similare:

$VMName = "nome macchina virtuale"
$VMCS = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_ComputerSystem -Filter "ElementName='$($VMName)'"
$keyboard = $VMCS.GetRelated("Msvm_Keyboard")
$keyboard.TypeText("Questo testo viene digitato") | out-null

Allo stesso modo è possibile simulare movimentazione e pressione tasti del mouse:

$VMName = "nome macchina virtuale"
$VMCS = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_ComputerSystem -Filter "ElementName='$($VMName)'"
$mouse = $VMCS.GetRelated("Msvm_SyntheticMouse")
$mouse.SetAbsolutePosition(300,450) | out-null
$mouse.ClickButton(2) | out-null

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *