[Windows 7] XP Mode か実機か Virtual PC か Hyper-V か見分ける方法とは?

みなさんごきげんよう。ういこです。

Windows 7 も期待をいい意味で裏切る売れ行きの様子でお母さんとってもうれしいです。ネットブックの普及ペースも予想以上ですが、女子供も持ちやすいバッテリの持ちはいいけど軽いのがたくさんでてますし、これならばもう少しなんというか、かわいらしい PC バッグが出ればもっと女子に売れるのになーと思う今日この頃。うちの会社でたとえば HbG とか United Arrows とかセレクトショップとコラボって見たりしたらイメージもよくなると思うんですがねー。

さて、そんな Windows 7 ですが、今日はぜんぜん「カワイく」ない世界のお話です。あ、今日「も」か。

[今日の御題]
XP Mode と実機の Windows XP を見分ける方法ってあるのかしら?教えて鏡さん。

[答え]
悲しいことに、動いている OS が仮想化環境 (Virtual) かホンモノの PC 上で動作しているものかを見分けることはできますが、Virtual の場合、その種類 (XP Mode or Virtual PC / Virtual Server / Hyper-V 上の Windows XP) かまでを完全に識別はできません。

(1) Virtual or 実機の見分け方
これは、WMI を使うことによって対処ができます。色々調べたり、過去の対応事例などを見ていましたところ、手としては以下の方法があるようです。(※ちなみに –b は旦那からのタレコミでございます。)

-a. Win32_BIOS クラスを使う
-b. Win32_BaseBoard クラスの Manufacturer 文字列と Win32_ComputerSystem クラスの Model 文字列を見る

-a. Win32_BIOS クラスを使う
BIOS の情報で Virtual か、実機か見分ける方法です。仮想環境が使う Phoenix BIOS の BIOSVersion プロパティの情報で見分けるということになりますが、これはマイクロソフトが採用する BIOS が Phoenix から変わる可能性などもありますし、BIOS のバージョンも今後変わるかもしれません。
なので、これは参考情報としてとらえるのがよさそうです。

wmites3

・"VRTUAL - 1000831"
⇒ Hyper-V Beta もしくは RC 上の Virtual Machine
・"VRTUAL - 5000805" or "BIOS Date: 05/05/08 20:35:56 Ver: 08.00.02"
⇒ Hyper-V 1.0 (Windows Server 2008)
・"VRTUAL - 3000919" or "BIOS Date: 03/19/09 22:51:32 Ver: 09.00.04"
⇒ Hyper-V 2.0 (Windows Server 2008 R2)
・"A M I - 2000622"
⇒ Virtual Server 2005 R2 Service Pack 1 上 or Virtual PC 2007
・"A M I - 9000520"
⇒ Virtual Server 2005 R2
・"A M I - 9000816" or "A M I - 6000901"
⇒ Windows Virtual PC / XP-Mode
・"A M I - 8000314" の場合
⇒ Virtual Server 2005 or Virtual PC 2004

これらは、以下のレジストリ キーから持ってきているみたいですね。

Windows XP :
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System
値: SystemBiosVersion

image

-b. Win32_BaseBoard クラスの Manufacturer 文字列と Win32_ComputerSystem クラスの Model 文字列を見る
そんなお客様には -b. および -c. の方法なんか良いかと思います。
これは、"システム情報ツール" の "システム製造元"、"システムモデル" に出てくる情報の値なのです。これであれば、回答は Microsoft モノです!という感じがしますし、良いのではないでしょうか。
少なくとも、これで対応はできるかと思います。

msinfo32-xp2

WMI でとってきたところ。Manufacturer が Microsoft Corporation、Model が Virtual Machine なので、分かりやすいですね。

wmites2 

(2) XP Mode or Virtual PC?
さて。いよいよ一番面倒なところです。上記で、Virturl なのか、実機なのかはわかりましたと。
では、Virtual だとして…それは XP mode なの?それとも Virtual PC だか、Virtual Server 、Hyper-V などいろんな仮想化技術のどれの上で動いてるヤツなの?というところが知りたいという方もいらっしゃるかと思います。

結論からいうと、XP Mode なのか、それ以外の仮想化技術なのかまでの区別は厳密にはつけられません。
結局、XP Mode のライフサイクルが Virtual PC のページにあるように、この辺の区別ってほとんど意味がないと思われているのかと思います。
規定値だと、"RegisteredOwner" レジストリ値に、"Windows XP Mode" とあります。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
値の名前: RegisteredOwner

つまり、上記レジストリの情報から取得した文字列が "Windows XP Mode" であるかを判定すればいいのでは…と思ったのですが。
そう、以下のサポート技術情報にあるように、このレジストリは変更ができてしまう情報なのです。実際、聞いた話だと OEM ベンダー様などで作られた環境では、この部分が改変されているということも聞きます。つまり、このレジストリが変更されていた場合には、もう XP Mode なのか分からなくなってしまうということなのです。

Windows XP のインストール後にユーザー名と会社名の情報を変更する方法
https://support.microsoft.com/kb/310441/ja

これが、上記のとおり「見分ける方法はない」という理由です。
こうした識別をしたいシナリオとしては、XP Mode 上で動作させることを想定したプログラム内で、たとえば仮想化環境では使えないデバイスなどを使う要件があるなどで判定をしたいというニーズなどが考えられますが、基本的に Virtual PC として想定してほしいということなのかもしれません。
でもどこにもドキュメントとかないんですよねぇ。

それでは、またー。

ういこう@ILM 一家はダチョウ倶楽部だったのか。