私はそれを行うには醜い方法を見つけましたが、少なくともVMホストに何かインストールまたは設定する必要はありません。
まず、winexeというユーティリティがあります。このユーティリティを使用すると、Windowsマシンへの端末接続を開くことができます。
は、それから私は、実行中のマシンを一時停止するマシンにパイプにいくつかのPowerShellのコードを、長い醜いPerlスクリプトを書きました:
sub hv_suspend_host {
my $host = $_[0];
my $code = <<'END';
echo '===BEGIN'
$query = "SELECT * FROM Msvm_ComputerSystem WHERE EnabledState != 3 AND EnabledState != 32769" #Exclude off and saved VMs
$VMs = get-wmiobject -query $query -namespace "root\virtualization" -computername "."
foreach ($VM in $VMs) {
if ($VM.name -ne $VM.ElementName) { # Exclude the host itself
if ($VM.RequestStateChange(32769).ReturnValue -eq 4096) { # Put the VM in a saved state
# It worked, log success
} else {
# It didn't, log failure
}
}
}
echo '===END'
exit
END
my $recv;
run(["winexe", '-U', "DOMAIN/$win_user%$win_pass", '--interactive=0', "//$host", 'powershell -command -'], \$code, \$recv);
$recv =~ tr/\r//d; # Convert to UNIX line endings
$recv =~ /===BEGIN\n(.+)===END/s; # Now recv contains anything you logged
}
あなたはそれを動作させるために、このビットを台無しにする必要がある場合があります。実装固有のもののいくつかをハックする必要がありましたが、出力キャプチャコードの一部を残しました。これには、ターゲットVMホストの管理者アカウントのログイン情報を含む$ win_userおよび$ win_passという名前のグローバル変数が必要です。また、あなたにはuse IPC::Run
が必要です。
開発にlibvirt用のHyper-Vドライバがあったと思います。プロジェクトが終了したかどうかはわかりませんが、一見価値があるかもしれません。 –