is there a Way to detect when run App in "virtual" Environment
WMI e.g. will fail to detect Hardware ...
Moderator: Rathinagiri
try this
Code: Select all
FUNCTION WMIService()
LOCAL oLocator
IF oWMI == NIL
oLocator := CreateObject( "wbemScripting.SwbemLocator" )
oWMI := oLocator:ConnectServer()
ENDIF
RETURN oWMI
Code: Select all
FUNCTION PhysicalMemoryInfo()
LOCAL oWmi, oMemory
LOCAL aitem := {}, aProp := {}, bCollBlock, j, jMax, i, iMax, colItems, cLine
LOCAL cInfo := ""
LOCAL nSumRAM := 0, cFormFactor := "", cMemoryType := ""
LOCAL bError := ERRORBLOCK( { | oErr | BREAK( oErr ) } )
oWmi := WmiService()
BEGIN SEQUENCE // will crash in "virtual" PC
FOR EACH oMemory IN oWmi:ExecQuery( "SELECT * FROM Win32_PhysicalMemory" )
nSumRAM += VAL( oMemory:Capacity )
cFormFactor := GetFormFaktorText( oMemory:FormFactor )
cMemoryType := GetRAMtype( oMemory:SMBIOSMemoryType )
NEXT
END SEQUENCE
ERRORBLOCK( bError )
IF EMPTY( cMemoryType ) .OR. EMPTY( cFormFactor ) .OR. EMPTY( nSumRAM )
ELSE
cInfo += LTRIM( STR( INT( nSumRAM / 1024 / 1024 ) ) ) + " MB " + CRLF
cInfo += "Memory Type : " + cMemoryType + " " + cFormFactor
ENDIF
RETURN cInfo
Code: Select all
FUNCTION GetFormFaktorText( nIn )
LOCAL aFT := {}
LOCAL nPosi, cText
AADD( aFT, { 00, "Unknown" } )
AADD( aFT, { 01, "Other" } )
AADD( aFT, { 02, "SiP" } )
AADD( aFT, { 03, "DIP" } )
AADD( aFT, { 04, "ZIP" } )
AADD( aFT, { 05, "SOJ" } )
AADD( aFT, { 06, "Proprietary" } )
AADD( aFT, { 07, "SIMM" } )
AADD( aFT, { 08, "DIMM" } )
AADD( aFT, { 09, "TSOPO" } )
AADD( aFT, { 10, "PGA" } )
AADD( aFT, { 11, "RIM" } )
AADD( aFT, { 12, "SODIMM" } )
AADD( aFT, { 13, "SRIMM" } )
AADD( aFT, { 14, "SMD" } )
AADD( aFT, { 15, "SSMP" } )
AADD( aFT, { 16, "QFP" } )
AADD( aFT, { 17, "TQFP" } )
AADD( aFT, { 18, "SOIC" } )
AADD( aFT, { 19, "LCC" } )
AADD( aFT, { 20, "PLCC" } )
AADD( aFT, { 21, "FPGA" } )
AADD( aFT, { 22, "LGA" } )
IF VALTYPE( nIn ) = "C"
nIn := VAL( nIn )
ENDIF
nPosi := ASCAN( aFT, { | e | e[ 1 ] = nIn } )
IF nPosi > 0
cText := aFT[ nPosi ] [ 2 ]
ELSE
cText := TRIM_NUMBER( nIn )
ENDIF
RETURN cTextCode: Select all
FUNCTION GetRAMtype( nIn )
LOCAL aFT := {}
LOCAL nPosi, cText
AADD( aFT, { 00, "Unknown" } )
AADD( aFT, { 01, "Other" } )
AADD( aFT, { 02, "DRAM" } )
AADD( aFT, { 03, "Synchronous DRAM" } )
AADD( aFT, { 04, "Cache DRAM" } )
AADD( aFT, { 05, "EDO" } )
AADD( aFT, { 06, "EDRAM" } )
AADD( aFT, { 07, "VRAM" } )
AADD( aFT, { 08, "SRAM" } )
AADD( aFT, { 09, "ROM" } )
AADD( aFT, { 10, "ROM" } )
AADD( aFT, { 11, "FLASH" } )
AADD( aFT, { 12, "EEPROM" } )
AADD( aFT, { 13, "FEPROM" } )
AADD( aFT, { 14, "EPROM" } )
AADD( aFT, { 15, "CDRAM" } )
AADD( aFT, { 16, "3DRAM" } )
AADD( aFT, { 17, "SDRAM" } )
AADD( aFT, { 18, "SGRAM" } )
AADD( aFT, { 19, "RDRAM" } )
AADD( aFT, { 20, "DDR" } )
AADD( aFT, { 21, "DDR2" } )
AADD( aFT, { 22, "DDR2 FB-DIMM" } )
AADD( aFT, { 24, "DDR3" } )
AADD( aFT, { 25, "FBD2" } )
AADD( aFT, { 26, "DDR4" } )
IF VALTYPE( nIn ) = "C"
nIn := VAL( nIn )
ENDIF
nPosi := ASCAN( aFT, { | e | e[ 1 ] = nIn } )
IF nPosi > 0
cText := aFT[ nPosi ] [ 2 ]
ELSE
cText := TRIM_NUMBER( nIn )
ENDIF
RETURN cText
Code: Select all
WMIC BIOS GET SERIALNUMBER
WMIC COMPUTERSYSTEM GET MODEL
WMIC COMPUTERSYSTEM GET MANUFACTURERCode: Select all
IF cManufacturer = "innotek GmbH" .AND. ;
cModel = "VirtualBox" .AND. ;
cProduct = "VirtualBox"
lRet := .T.
ENDIF
MsgDebug(lRet,cManufacturer, cModel , cProduct,cSerialNumber )