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用ツールの自作 その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用ツールの自作 その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用ツールの自作 その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用ツールの自作 その1

会社でまだVirtualServer2005がまだ稼働してるのですが、いつ誰が使ってるかわからないので24時間稼働しっぱなしです。

そんな使い方をしていると、たまにホストOSにアクセスできない状態が発生するんです。
早い段階で見つかれば「IIS Admin Service」(と関連サービス)を再起動すれば回復するのですが、大体は「時すでに遅し」で強制再起動です。
(ログインすら数十分かかるので、ハード的な再起動です)

当然、ゲストOSの稼働状態は吹っ飛び、利用者からは「なんで~」って感じになるので、定期的にリブートしたいとは思うのですが、イチイチゲストOSを保存するのが面倒。
(Hyper-Vならシャットダウン時にゲストOSを自動保存できるのでいいですね。)

ネットを探すと、スクリプトでゲストOSの保存とかは転がってるんですけど、どのゲストOSが実行中だったかをスクリプトで保存するのがちょっと億劫になったので、VB.NETでツールを作成してみることに。

途中でいろいろ引っかかったところを以降で保存。

作ったツールはここに置いてますので、ご自由にどうぞ。
※使用は自由ですが、保証はしませんしサポートもしません。「自己責任」にてお願いします。

使用方法ですが、
 RebootVirtualServer.exe [動作] [稼働中のVirtualMachine名を格納するファイル名]
  ・[動作]
   "save"と"resume"しかありません。
    save:稼働中のVirtualMachine名をファイルに出力し、「保存」状態に変更します。
    resume:ファイルに保存されたVirtualMachine名を取得し、「実行中」状態に変更します。
  ・[稼働中のVirtualMachine名を格納するファイル名]
   稼働中のVirtualMachine名の保存に使用するファイル名を指定します。
となります。

ログイン画面でのユーザ名非表示

今日は完全に覚書です。

ログイン画面に特定のユーザ名を表示させたくない場合、
 ・レジストリエディタで「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList」まで移動
  (インストール直後だと、「SpecialAccounts」と「UserList」を作成する必要あり)
 ・新規で「DWORD(32ビット値)」を作成し、名前を非表示にしたいユーザ名にする
 ・値は’0’が非表示、’1’が表示

ちなみに、「前回のログインユーザ名を表示させたくない」場合は、グループポリシーエディタから、
 ・「ローカルコンピュータポリシー」-「コンピューターの構成」-「Windowsの設定」-「セキュリティの設定」-「ローカルポリシー」-「セキュリティオプション」を選択
 ・「対話型ログオン:最後のユーザ名を表示しない」を有効に変更

勉強会参加:第18回 .NET 勉強会 / ヒーロー島

9/25開催の「第18回 .NET 勉強会 / ヒーロー島」に参加させて頂きました。

今回のゲストは
・「サイトコア株式会社」の原水さんによるSitecore CMS
 →原水さんのセッションは初めてだったと思います。
・の北端さんによるSharePoint2010インストール
 →ご本人曰く「Exchangeが本職」にはちょっとびっくりでした。
・ご存じ はるか さおさんによるSilverlight サンプル
 →さおさんのセッションも初めてだったと思います。
という豪勢な構成でした。

また、TechEd2010で発射されたミサイル(RemoteFX USBデバイス リダイレクト)の実演もあり
、いろんなことが聞けた一日でした。

恒例の懇親会には、セッションゲストに加えて
 ・MVPリードの笹瀬さん
 ・「Windows Server 2008 R2 構築・運用・管理パーフェクトガイド」の著者 知北さん
も合流され、とても楽しい時間を過ごせました。
(パーフェクトガイドは帰りがけにさっそく購入させていただきました)

また次回も参加させて頂ければと思います。
※今度の勉強会は3周年記念とのことです。

ゲートチェックイン時のソース管理状態 その2

さて、Eclipse編ですが、結論は「Eclipseだとちょっと使いづらい」です。

ゲートチェックインなしの場合はVS IDEと同じ動き(自動で「保留中の変更」が調整される)になります。

ゲートチェックインありの場合、ゲートチェックイン完了まではVS IDEと同じです。
・ゲートチェックイン正常終了時

Scr000072

ここから少し動作が異なるのが、「ビルド処理ログ表示画面からワークスペースの調整が行えない」というものです。
先ほどの「ゲートチェックイン正常終了時」に「ビルド処理ログ表示画面」も表示されていますが、VS IDEでは表示されていた「ワークスペースの調整」がありません。

ビルドが完了しているのが分かっているのに、通知を待たないといけないのはちょっといやですね。

あれ?、Windowsなら完了通知あるけど、MacとかLinuxだとどうすればいいんだろう??

ゲートチェックイン時のソース管理状態 その1


このネタは凄く長いです。m(. ̄  ̄.)mス・スイマセーン

通常(ゲートチェックインなし)、修正中のソースは「保留中の変更」として管理され、チェックインが完了すると「保留中の変更」からなくなります。
・修正中

Scr000058

・チェックイン後

Scr000059

ところが、「ゲートチェックイン」を発動させると、ゲートチェックインが正常となった場合でも「保留中の変更」が変更されません。
・ゲートチェックイン正常終了後

Scr000062

この場合、ビルド完了通知の中の「ワークスペースの調整」を行うことにより正常な状態になります。
・ビルド完了通知 その1

Scr000063

「調整」ボタン押下で実行

・ビルド完了通知 その2(右下)

Scr000064

右下に表示されている「ワークスペースの調整」リンクを押下で実行

・ビルド完了通知 その3(処理ログ)

Scr000065

2行目の「ワークスペースの調整」リンクを押下で実行

・調整中

Scr000066

ほんとは自動で調整してほしいところですが、この中では「その3」が一番使えます。
→「その1」と「その2」は、ビルドが完了してから表示されるまでに数分かかりますが、「その3」はビルド完了後すぐに実行できます。

次はEclipse編です。

1つのTFSプロジェクトで、.NETとJavaの共存は可能か?

世の中一般的にあるかどうはわかりませんが、自分の部署では、Javaと.NET(正確にはNative C++ですけど)を併用することがあります。

プロジェクト管理上、Javaと.NETを別々に管理しなくない(あとでまとめる作業が発生してしまう)ので、1つのTFSプロジェクトに両方とも突っ込みたいと考えます。

今のところの結論は、
 「ゲートチェックインを使わないのであればすんなり共存可能」

です。

なんでか?というと、
まず、.NETとJavaのプロジェクトは別々に登録可能です。
ビルド定義も別々に作成可能です。
但し、「ゲートチェックイン」は複数定義が存在する状態で、
 ・.NETからのチェックインした場合は、確認画面から実行対象とするビルド定義を指定する
Scr000057
 ・Eclipseからは、確認画面なしで1つだけビルド定義が実行される
という動作になります。

Eclipseから実行されるビルド定義がJava用であればまだOKなのですが、.NET側のビルド定義が実行される可能性があるのなら使えない機能に。

と書きながら、Javaのプロジェクトが2つ以上あるときにはどう頑張っても無理?