如何以编程方式(C#)告知软件是在VM还是物理机器上运行

时间:2014-04-30 20:43:33

标签: c# .net windows virtual-machine

我已经研究了几天如何以编程方式区分(C#) 如果我的软件(Windows)在VM或物理机上运行。我找到的方法有两个:

  1. 测试特定属性,表明您正在特定类型的VM(VMWare,AMI等)上运行。缺点:如果你没有在他们身上运行怎么办?如果制造商可以轻易改变这些属性怎么办?
  2. 尝试使用WMI通过查询某些属性来确定:我看到至少五个不同的代码片段,彼此相互矛盾,并且有人评论“它不起作用”。
  3. 我发现很难相信我们没有明确的解决方案来做出这种区分。任何人都可以为这个问题共享一段强大的代码吗?

2 个答案:

答案 0 :(得分:1)

我的建议是轮询运行应用程序的计算机的注册表,以获取VM插入的特定密钥。物理机器不太可能拥有密钥。

例如,下面是我的一个VMware开发箱中某些键的屏幕截图 如果运行VMware,您可以从应用程序中检查是否存在部分或全部密钥。

由于这是用C#标记的,我建议您使用以下Stack Overflow问题中的方法:Read Registry Keys via C#

相同的方法适用于任何其他VM系统。

VMware Keys in Windows Server

答案 1 :(得分:0)

据我所知,无法确定您是否处于虚拟环境中。

我会从:

开始
  • 查找特定于VM的虚拟硬件(例如网络适配器或USB控制器等)
  • 查找特定于VM的处理器功能 一些虚拟机引入了额外的入侵集。

可能还有别的......