アプリケーションが仮想マシンで実行されているかどうかを検出するにはどうすればよいですか(.NETまたはWin32)?
9 に答える
これは私が使用するものです:
using (var searcher = new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem"))
{
using (var items = searcher.Get())
{
foreach (var item in items)
{
string manufacturer = item["Manufacturer"].ToString().ToLower();
if ((manufacturer == "microsoft corporation" && item["Model"].ToString().ToUpperInvariant().Contains("VIRTUAL"))
|| manufacturer.Contains("vmware")
|| item["Model"].ToString() == "VirtualBox")
{
return true;
}
}
}
}
return false;
編集 2014-12-02 : Microsoft Surface Pro を VM として検出しないようにコードを更新しました。これを指摘してくれた Erik Funkenbusch に感謝します。
編集 2017-06-29 : プロパティの値もチェックするようにコードを更新しましたHypervisorPresent
。
編集 2018-02-05 : プロパティのチェックがHypervisorPresent
正しくないため削除されました。Hyper-V サーバー上のホスト O/S で実行されている場合、このプロパティは true を返す可能性があります。
Virtual PC Guyのブログ投稿「Microsoft仮想マシンの検出」によると、WMIを使用してマザーボードの製造元を確認できます。PowerShellの場合:
(gwmi Win32_BaseBoard).Manufacturer -eq "Microsoft Corporation"
この C 関数は VM ゲスト OS を検出します: (Windows でテスト、Visual Studio でコンパイル)
#include <intrin.h>
bool isGuestOSVM()
{
unsigned int cpuInfo[4];
__cpuid((int*)cpuInfo,1);
return ((cpuInfo[2] >> 31) & 1) == 1;
}
Jay Abuzi は、powershell でソリューションを示しました。以下は ac# 関数と同じです:
/// <summary>
/// Detect if this OS runs in a virtual machine
///
/// http://blogs.msdn.com/b/virtual_pc_guy/archive/2005/10/27/484479.aspx
///
/// Microsoft themselves say you can see that by looking at the motherboard via wmi
/// </summary>
/// <returns>false</returns> if it runs on a fysical machine
public bool DetectVirtualMachine()
{
bool result = false;
const string MICROSOFTCORPORATION ="microsoft corporation";
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2","SELECT * FROM Win32_BaseBoard");
foreach (ManagementObject queryObj in searcher.Get())
{
result = queryObj["Manufacturer"].ToString().ToLower() == MICROSOFTCORPORATION.ToLower();
}
return result;
}
catch (ManagementException ex)
{
return result;
}
}
C# アプリが vmware VM で実行されているかどうかを確認する最も簡単な方法は、NIC カードの MAC アドレスを確認することです。VMware VM の場合は、常に 00:50:56:XX:YY:ZZ になります。
ここで解決されているように、NIC を列挙することができます。
public static bool isVirtualMachine()
{
const string MICROSOFTCORPORATION = "microsoft corporation";
const string VMWARE = "vmware";
foreach (var item in new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
string manufacturer = item["Manufacturer"].ToString().ToLower();
// Check the Manufacturer (eg: vmware, inc)
if (manufacturer.Contains(MICROSOFTCORPORATION) || manufacturer.Contains(VMWARE))
{
return true;
}
// Also, check the model (eg: VMware Virtual Platform)
if (item["Model"] != null)
{
string model = item["Model"].ToString().ToLower();
if (model.Contains(MICROSOFTCORPORATION) || model.Contains(VMWARE))
{
return true;
}
}
}
return false;
}