ラボ/データセンターのWindowsサーバーにデスクトップをリモーティングしています。すべてのサーバーがプログラムで仮想マシンまたは物理サーバーであることを理解する必要があります。確かに、環境シートにどちらがどちらであるかが示されています。しかし、私はそれを区別するためのコードを書く必要があります。どのようなテクニックを使用する必要がありますか?そのための.Netアセンブリが見つかりませんでした。あなたの知識やガイダンス、研究の方向性やリンクを共有する専門家を探しています、何でもありがたいです!
8 に答える
次のPowerShellスクリプトを使用してみてください。このスクリプトは、WMIを使用して、マシンが仮想マシンであるか物理マシンであるかを確認します。
gwmi -q "select * from win32_computersystem"
確かに、C#コードを使用してWMIをクエリすることもできます。上記のスクリプトの出力は次のようになります。
ドメイン:..。 メーカー:Microsoft Corporation モデル:仮想マシン 名前 : ..... ...。
コマンドプロンプトからこれを確認するには、次のコマンドを実行できます。systeminfo | find "System"
仮想サーバーの出力例:
System Manufacturer: Microsoft Corporation
System Model: Virtual Machine
System Type: x64-based PC
物理サーバーの出力例:
System Manufacturer: HP
System Model: ProLiant BL460c G6
System Type: x64-based PC
私の知る限り、これを行う簡単な方法はありません。
いくつかの回避策がありますが、少なくとも私が知る限り、万能の解決策はありません。
Ben Armstrongは、 Microsoft仮想マシンの検出に関する投稿を書きました。仮想PCとVMWareのどちらで実行しているかを判断できる低レベルのトリックがありますが、それでもVirtualBoxなどは除外されます。
試してみたいトリックは、VMWareツールまたはVirtualBoxツールがインストールされているかどうかを検出することです。ほとんどの場合、必要な機能を提供するためにゲストOSにインストールされますが、異なるインストールGUIDをユーザー側で維持するのは難しいため、理想的なソリューションではありません。
---また、VMがLinux KVM環境で実行されている場合、出力は次のようになります。
ベアメタルで実行しているか仮想コンピューターで実行しているかを簡単に判断する方法はありません。たとえば、マシンにネットワークアダプターがあるかどうかなど、ハードウェア情報を取得して知識に基づいた推測を行うのが最善の方法です。これには、Microsoft、VMware、Oracle、Hyper-V、Virtual、またはVirtualBoxが含まれています。Microsoft、Oracle、またはVMwareのいずれもネットワークカードを製造していないことを考えると、おそらく仮想マシンです。
C#を使用する場合、このハードウェア情報やその他のハードウェア情報を取得するためのクラスはManagementClassです。また、ManagementClassを使用してコンピューターから大量の情報を取得できるこの素晴らしいプロジェクトもあります。
systeminfoコマンド@コマンドプロンプトを実行します。システムmenufacturernシステムモデルの詳細を参照してください。そこには、美徳と物理的な機械の情報があります。
これを試して:
FOR /F "tokens=*" %a IN ('wmic bios get bioscharacteristics^|find /c "33"') DO set USBlegacy=%a
これにより、私の環境の限られた範囲のデスクトップとラップトップの場合は「1」が返され、VMWareワークステーション9、ESX 5.5、およびCitrix6.5と7.6の場合は「0」が返されます。BIOSCharacteristic "50"(1つは "システムベンダー用に予約済み")私は4つの仮想環境でしか見つけられなかったので、逆に機能します。
編集:またはこれがあります:
FOR /F "tokens=*" %a IN ('wmic path win32_pnpentity get ^|find /c "ACPI Fan"') DO set ACPIfan=%a
HPデスクトップでは「5」を返し、VMwareワークステーション9およびESX 5.5では「0」を返しますが、他ではテストされていません。
このコマンドはcmdまたはpowershellで使用できます
システム情報
次のテキスト(または同様のテキスト)を含む行が見つかります。
システムメーカー:VMware、Inc.システムモデル:VMware仮想プラットフォーム
これを確実に行うために私が知っている唯一の*プログラム的な*方法は次のとおりです。
- ネットワーク(またはIP範囲)をクロールしてマシンのリストを取得するアプリを作成します。
- それらのマシンを人に見せて、VMの場合はチェックボックスをオンにするように依頼します...
- レポートを印刷します。