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.
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