もう1年以上も前に、以下の投稿をしました。
Hyper-V の「データ交換」機能を使用すると、「ホスト OS」経由で「ゲスト OS」の情報を知ることができます。
※具体的な方法は上記の投稿を参照してください
この機能の何が便利かというと、ゲストOSにネットワーク的に接続できなくても、ホストに問い合わせれば情報が得られるというところです。マルチテナントなどの理由で、ホストとゲストのネットワーク的な接続性を無効にしている場合には有用でしょう。
既定で参照可能な情報は、以下のようなものです。
FullyQualifiedDomainName:TF20101102-01.tf.com OSName:Windows Server 2008 R2 Enterprise OSVersion:6.1.7600 CSDVersion OSMajorVersion:6 OSMinorVersion:1 OSBuildNumber:7600 OSPlatformId:2 ServicePackMajor:0 ServicePackMinor:0 SuiteMask:274 ProductType:2 OSEditionId:10 ProcessorArchitecture:9 IntegrationServicesVersion:6.1.7600.16385 NetworkAddressIPv4:192.168.200.1;192.168.200.10;xxx.xx.... NetworkAddressIPv6:2002:xxxx:f0a7::xxxx:f0a7 RDPAddressIPv4:192.168.200.1;192.168.200.10;xxx.xx.... RDPAddressIPv6:2002:xxxx:f0a7::xxxx:f0a7
これらの情報から、ゲスト OS の基本的な情報を知ることができます。
上記の値は、ゲストOSの以下のレジストリパスに書かれています。
HKEY_LOCAL_MACHINE
\SOFTWARE
\Microsoft
\Virtual Machine
\Auto
では、業務に特化した独自の情報をホストOS経由で知りたい...といった場合にはどうしたらよいでしょう?
あくまでも「マイクロソフトにサポートされた方式ではない」という前提で書きますが、上記のレジストリパスに書いてしまえばよいのです。
ただし、OS の再起動により(Hyper-V Data Exchange Service の再起動ではなく)独自に追加したエントリはクリアされるので注意してください。
例えば、ゲストOSにインストールされているサービスの状態を監視したい場合には、以下のようなスクリプトを定期的に実行して上記のキーに書き込み、ホスト側からも定期的に取りだせばよいわけです。
以下の例では、PowerShell を使用しています。$Svc に サービスの状態一覧を格納し、Set-ItemProperty コマンドレットを使用してレジストリに各サービスの状態を格納しています。本当は Reg_Multi_SZ 形式で全てのサービスの状態を1つのValueで格納するのが美しいのですが、この形式だとホスト側から KVP Exchange を介してデータが受け取れないようなのです。仕方がないので、ちょっとアレかなぁとは思いつつ、String 形式で1サービス 1 Value で格納しています(もっと良い方法をお持ちの方、教えてください!)。
※以下はゲスト側で実行するスクリプトです
| PS C:\> $regpath_auto = "HKLM:Software\Microsoft\Virtual Machine\auto" |
上記のスクリプトの結果、Auto キーには以下のようなデータが格納されます。うーん、美しくない....。ま、とりあえず、それぞれのサービスの起動状態
あとはホスト側で以下のようなスクリプトを実行して、サービスの状態を取得すればOKです。
※以下のスクリプとはホスト側、もしくはホストと通信可能なマシンで実行します
| PS C:\> Cred = Get-Credential localhost\administrator PS C:\> filter Import-CimXml PS C:\> $kvp.GuestIntrinsicExchangeItems | Import-CimXml | ft Name,Data |
取得した結果は以下のようなかんじで表示されるはずです。赤い文字であらわした部分が、ゲストOS上で動作しているサービスの状態です。
| PS C:\> $kvp.GuestIntrinsicExchangeItems | Import-CimXml | ft Name,Data Name Data PS C:\> |
次回はホストからゲストにメッセージを送付する方法について投稿します。
