当前位置:  开发笔记 > 运维 > 正文

如何检测我的应用程序是否在虚拟机中运行?

如何解决《如何检测我的应用程序是否在虚拟机中运行?》经验,为你挑选了3个好方法。

如果我的应用程序在虚拟机中运行,如何检测(.NET或Win32)?



1> RobSiklos..:

这是我使用的:

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.


一些快速测试看起来像测试表达式可以简化(对于'简化'的某些定义)到`item ["Model"].ToString().ToLower().包含("虚拟")`.
我认为这段代码会将微软的计算机硬件检测为VM,例如Surface Pro.

2> Jay Bazuzi..:

根据Virtual PC Guy的博客文章" 检测Microsoft虚拟机 ",您可以使用WMI检查主板的制造商.在PowerShell中:

 (gwmi Win32_BaseBoard).Manufacturer -eq "Microsoft Corporation"


呃,非MS VM怎么样?
另外,正如评论者@ErikFunkenbusch对我对此问题的回答所提到的,此检查会错误地将MS Surface Pro识别为VM.

3> Arthur Chapa..:

以下是一种实现方法的示例.它只适用于微软的Virtual PC和VMWare,但它是一个开始:http: //www.codeproject.com/KB/system/VmDetect.aspx

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有