如何阻止我的应用程序在Virtualbox上运行?

时间:2017-05-06 05:43:24

标签: delphi delphi-10.2-tokyo

我已经尝试this unit来检测我的应用程序是否在Oracle VirtualBox中运行,但它没有检测到VirtualBox。

我已经在VirtualBox中安装了Windows 7进行了测试。

是否有任何有效的方法可以防止我的VCL应用程序在VirtualBox中运行?

3 个答案:

答案 0 :(得分:3)

您可以使用Win32_BaseBoard WMI类,并检查产品字符串是否包含单词" Virtual"

例如:

function _IsOSVirtual(): Boolean;
const
  v = 'virtual';
Begin
  Result := False;
  CoInitialize(nil);
  try
     if Pos(v, LowerCase(GetWin32_BaseBoard('Product'))) > 0 then
      Result := True;
  finally
    CoUninitialize;
  end;
end;

答案 1 :(得分:0)

如果您可以获得Bios信息(使用WMI或其他方法),您可以找到VirtualBox的痕迹。

instance of Win32_BIOS
{
    ...
    BIOSVersion = {"VBOX   - 1"};
    Caption = "Default System BIOS";
    Description = "Default System BIOS";
    Manufacturer = "innotek GmbH";
    Name = "Default System BIOS";
    SerialNumber = "0";
    SMBIOSBIOSVersion = "VirtualBox";
    SMBIOSPresent = TRUE;
    SoftwareElementID = "Default System BIOS";
    SoftwareElementState = 3;
    Status = "OK";
    Version = "VBOX   - 1";
};

继续使用WMI,其他类可以帮助您识别VirtualBox安装。例如,此查询:

Select Manufacturer, Model, OEMStringArray from Win32_ComputerSystem

返回此值:

instance of Win32_ComputerSystem
{
    Manufacturer = "innotek GmbH";
    Model = "VirtualBox";
    OEMStringArray = {"vboxVer_5.1.22", "vboxRev_115126"};
};

答案 2 :(得分:0)

function IsRunningVirtualBox : Boolean;
var
   vHandle : THandle;
begin
   Result := false;
   vHandle := LoadLibrary('VBoxHook.dll');
   if vHandle <> 0 then begin
      Result := true;
      FreeLibrary(vHandle);
   end;
end;