2017-05-06 5 views
1

アプリケーションがOracle VirtualBoxで実行されているかどうかを検出するのにthis unitを試しましたが、VirtualBoxが検出されていません。私のアプリがVirtualboxで動作するのを止めるにはどうしたらいいですか?

VirtualBoxにインストールされたWindows 7でテストしました。

VCLアプリケーションがVirtualBoxで実行されないようにする効率的な方法はありますか?

+2

あなたはそれがVirtualBoxのを検出していない理由を把握するためのコードをデバッグしようとしましたか?ダウンロードにコメントがあります: "* Windows 8がインストールされている場合、このコードはバーチャルボックスを検出しませんか?"なので、おそらくVirtualBoxの検出は一般的に壊れていますか?検出コードを見ると、実際には非常に簡単なコードです。アプリが実行されているシステムに 'VBoxHook.dll'や' \\。\ VBoxMiniRdrDN'が存在するかどうかをテストするだけです。おそらくあなたのVirtualBoxのバージョンにはこれらのアイテムがありませんか? –

+2

バーチャルボックスの特長は何ですか?ブロックしたいが、他の仮想マシンはブロックしない。仮想マシンは未来です。それらをブロックしようとすると、あなたのソフトウェアの有用性が損なわれます。 –

+0

@DavidHeffernan最低限必要なハードウェア/ソフトウェアサポートの欠如が気になります。 DX10 +またはOpenGL3.0 +が(少なくとも現在は)必要なものは、たとえば正しく動作しません。つまり、ソフトウェアがVM内にあるかどうかなどの他のインジケータからのサポートを回路的に想定するのではなく、必要な特定の要件についてソフトウェアが正しくテストする必要があります...確かにVirtualBoxのサポートは時間とともに変化します。 –

答えて

3

製品の文字列は、例えば、単語「Virtual

が含まれている場合は、Win32_BaseBoard WMIクラスを使用して確認することができます。

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; 
+0

v8以降のVMWareには[440BXデスクトップリファレンスプラットフォーム](https://communities.vmware.com/thread/409703)もあります。 – FredS

0

を使用すると、(WMIまたは他の方法で)されたBIOS情報を得ることができる場合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"; 
}; 

他のクラスを使用すると、VirtualBoxのインストールを識別できます。たとえば、このクエリ:

Select Manufacturer, Model, OEMStringArray from Win32_ComputerSystem 

戻り、この値:

instance of Win32_ComputerSystem 
{ 
    Manufacturer = "innotek GmbH"; 
    Model = "VirtualBox"; 
    OEMStringArray = {"vboxVer_5.1.22", "vboxRev_115126"}; 
}; 
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; 
関連する問題