VirtualServer2005用ツールの自作 その2

まずは、VB.NETから操作する方式とその設定について。

WMIで操作するのが楽なんですが、稼働中のゲストOSしか列挙できない様子。
今回の対応だけであればいいのですが、機能追加を考えると稼働していないゲストOSも操作可能にしたいので却下。

となるとCOM経由でのアクセスになります。
スクリプトでも「CreateObject」を使って操作している例が多数あります。
ですが、VB.NETから「CreateObject」はしたくないので、「参照の追加」でCOM参照をしておきたいなと。
Photo
でも、何を追加すればいいの??

小一時間探してなんとか資料を発見。
VirtualServer2005インストールフォルダ(デフォルトは「C:\Program Files\Microsoft Virtual Server」)の下に「Documentation」フォルダがあり、その中の「Microsoft.VirtualServer.Interop.dll」を参照追加します。
(同じフォルダにある「Microsoft.VMRCClientControl.Interop.dll」は、VMRCクライアントの機能を使用するためのDLLです)

あとは「Microsoft.VirtualServer.Interop」をImportすれば簡単にソース記述できるようになります。
(Intellisenseもちゃんと出てきます)

Imports

これでメデタシメデタシと思ってたのですが...。

VirtualServer2005用ツールの自作 その3

とりあえず、適当なサンプルを書いて動かしてみると...


Photo_2

なんじゃこりゃ~

どうもプロセス偽装が必要な様子。まぁ、サービス実行されているものに対して操作を行うので当然といえば当然ですが。
でもどうすりゃいいの??ということで小1日かけて検索し、たどり着いたので英語のMSDNにあるVirtualServerのページ
Msdn

COMを使って操作するための基礎情報は、「Using Microsoft Virtual Server」-「Connecting to the Virtual Server COM Object」にあります。
しっかりとC#でサンプルがあるので確認すると、Ole32.dllにある「CoInitializeSecurity()」を呼び出して偽装レベルを設定しています。

これをほぼコピペでVBに移植したら、やっと動きました。
これで完成か??と思いきや、まだネタがありました。orz

VirtualServer2005用ツールの自作 その4

使い方としては、
 ・Windowsの「タスク」で週末夜間にsaveを実行→shutdownコマンドで再起動
 ・タスクに「システム起動時」のジョブを作成し、そこでresumeを実行
ということを考えていたので、Hyper-Vの中に作ったVirtualServer2005環境で実テスト。
saveはちゃんとできて、shutdownコマンドも実行されてOS再起動。
ログインして管理用Webサイトを確認すると.....「保存済み」のまま??

タスクの実行結果を確認すると、「前回の結果」がエラー(0x0ではない)になっています。

Photo_3

エラー出力をテキストファイルにリダイレクトするようにしていたので、テキストファイルを確認すると、アクセス拒否エラー??

Resume

手動ではresumeもちゃんと動作したし、タスク実行ユーザもログインユーザを指定しているのに....?
またもや小一時間悩み、出た結論は「Virtual Serverサービスが起動されてないから」。

Windowsのサービス起動は基本的に「無秩序」に起動です。
UNIX/Linuxのように「シェルに記述した順番で起動」というものではありません。
サービスの依存関係で前提サービスを指定することは可能ですが、すべてのサービスに対して秩序は求めていません。
(平行で実行されるので、起動時間の短縮にはなるのですが)

ちなみに、Virtual ServerサービスとTask Schedulerサービスの依存関係は
Vs

Task

となっています。
「Remote Procedure Call(RPC)」サービスが起動した後にVirtual ServerサービスとTask Schedulerが起動されますが、Virtual Serverサービスが起動される前にTask Schedulerサービスが起動されてしまうためにエラーになっているようです。

ちょっと長いので分割。

VirtualServer2005用ツールの自作 その5

Virtual Serverが起動されていないせいでエラーになるのであれば、起動するまで待てばよいと。

サービス操作関連は「System.ServiceProcess」名前空間にあるクラスを使えば簡単に操作できます。
サービスが、とある状態になるまで待機するメソッドとして「System.ServiceProcess.ServiceController.WaitForStatus()」があるので、これを使います。
            Dim sc As New System.ServiceProcess.ServiceController("Virtual Server")

            Console.WriteLine("VirtualServer起動待ち")
            sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running)
            Console.WriteLine("VirtualServer起動確認完了")
        End Sub
これで、Virtual Serverが起動してから操作が行えるようになりました。

思ったより結構手間がかかりましたが、これで運用できそうです。

とっととHyper-Vにしたい!!

VirtualServer2005用ツールの自作 その6

補足情報です。

○ツールでのVirtualMachine状態確認について
 少しだけ状態確認(「実行中でないと保存させない」とか)を行っていますが、正確なチェック内容ではありません。
 VirtualServerの正確な状態遷移図(State Diagram)は
英語のMSDN(Virtual Machine State Diagram)にあります。
 ちなみに、Hyper-Vについても
資料(Msvm_ComputerSystem Class)
は存在するのですが、V1.0とV2.0で仕様が異なるようです。

○再起動用バッチファイルについて
 ソースを収納したZIPファイルに、再起動用のバッチファイルを含めています。
 (tempフォルダ内の「再起動時.bat」/「再起動後.bat」)

あ~疲れた

ブログ引っ越し作業が完了しました。

Windows Liveからはまとめて移せる手段がないようだったので、1個1個丹精込めてコピペしました。┐( ̄ヘ ̄)┌ フゥゥ~