找回密码  加入

AUTOIT CN

搜索
查看: 12880|回复: 9

[AU3基础] 如何判断当前环境是否在Vmware的虚拟机里面?

[复制链接]
发表于 2013-2-5 14:49:23 | 显示全部楼层 |阅读模式
判断后的想法就是如果是在Vmware里,那么自动安装起Vmware Tools,应该怎么判断呢?
发表于 2013-2-5 18:31:22 | 显示全部楼层
在注册表  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet 有几个包含VMWare的项,搜索定位下,忘记具体哪个了
发表于 2013-2-5 19:59:29 | 显示全部楼层
据说用cpuid比较可靠  道听途说  http://www.hx95.com/Article/Tech/201112/49785.html
发表于 2013-2-5 20:08:56 | 显示全部楼层
要不根据硬盘的型号来判断 看各大虚拟机的硬盘型号都有自己软件的名字。
发表于 2013-2-5 21:53:10 | 显示全部楼层
可以通过wmi获取主板BIOS信息对比。
发表于 2013-2-5 22:06:55 | 显示全部楼层
  1. Dim $VFlag = True
  2. Dim $obj = ObjGet("winmgmts:\\localhost\root\CIMV2")
  3. Dim $objItem = $obj.ExecQuery("SELECT * FROM Win32_DiskDrive", "WQL", 0x10 + 0x20)

  4. If IsObj($objItem) Then
  5.         For $Item In $objItem
  6.                 If StringInStr($Item.Model, "VMWARE") Then
  7.                         $VFlag = False
  8.                         ExitLoop
  9.                 EndIf
  10.         Next
  11.         If $VFlag Then
  12.                 MsgBox(0, "", "NOT VMWARE")
  13.         Else
  14.                 MsgBox(0, "", "IS VMWARE")
  15.         EndIf
  16.        
  17.        
  18. Else
  19.         MsgBox(0, "error", "NO obj")
  20. EndIf
复制代码
发表于 2013-2-5 22:08:22 | 显示全部楼层
  1. $a = _CheckVM()
  2. If $a = "" Then
  3.         MsgBox(0, "我不在虚拟机里", "我不在虚拟机里!")
  4. Else
  5.         MsgBox(0, "我在虚拟机里!", "我在虚拟机里,我的理由是" & @CRLF & @CRLF & $a)
  6. EndIf

  7. ;检查是否运行于虚拟机环境。返回空值说明运行于真实环境,返回一个字符串,说明运行于虚拟机环境并给出解释。
  8. ;方法:检查虚拟机服务/进程,硬盘,BIOS 主板/芯片组
  9. ;发现2个以上即确定为虚拟机环境

  10. Func _CheckVM()
  11.         $strComputer = '.'
  12.         $objWMIService = ObjGet('winmgmts:\\' & $strComputer & '\root\cimv2')
  13.         $vmhit_count = 0
  14.         $vmhit_details = ""
  15.         ; 检查虚拟机管理程序
  16.         If ProcessExists("VBoxService.exe") Or ProcessExists("VBoxTray.exe") Or ProcessExists("VMwareTray.exe") Or ProcessExists("VMwareUser.exe") Then _AddVMHit($vmhit_count, $vmhit_details, "RUNNING SOFTWARE", "Found a Vbox or VMware guest OS service or tray process")
  17.         ; 检查虚拟机设备
  18.         If Not IsObj($objWMIService) Then
  19.                 MsgBox(0, "", "? WTF?")
  20.                 Return ""
  21.         EndIf
  22.         ; 检查虚拟机硬盘
  23.         $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive', 'WQL', 0x10 + 0x20)
  24.         If IsObj($colItems) Then
  25.                 For $objItem In $colItems
  26.                         $vReturn = $objItem.Model
  27.                         Select
  28.                                 Case StringInStr($vReturn, "VBOX HARDDISK")
  29.                                         _AddVMHit($vmhit_count, $vmhit_details, "DISKS", "Found device ""VBOX HARDDISK""")
  30.                                 Case StringInStr($vReturn, "QEMU HARDDISK")
  31.                                         _AddVMHit($vmhit_count, $vmhit_details, "DISKS", "Found device ""QEMU HARDDISK""")
  32.                                 Case StringInStr($vReturn, "VMWARE VIRTUAL IDE HARD DRIVE")
  33.                                         _AddVMHit($vmhit_count, $vmhit_details, "DISKS", "Found device ""VMWARE VIRTUAL IDE HARD DRIVE""")
  34.                                 Case StringInStr($vReturn, "VMWARE Virtual S SCSI Disk Device")
  35.                                         _AddVMHit($vmhit_count, $vmhit_details, "DISKS", "Found device ""VMWARE Virtual S SCSI Disk Device""")
  36.                         EndSelect
  37.                 Next
  38.         EndIf
  39.         ; 检查虚拟机BIOS
  40.         $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", 0x10 + 0x20)
  41.         If IsObj($colItems) Then
  42.                 For $objItem In $colItems
  43.                         Select
  44.                                 Case StringInStr($objItem.BIOSVersion(0), "Vbox")
  45.                                         _AddVMHit($vmhit_count, $vmhit_details, "BIOS", "Found Vbox BIOS version")
  46.                                 Case StringInStr($objItem.SMBIOSBIOSVersion, "virt")
  47.                                         _AddVMHit($vmhit_count, $vmhit_details, "BIOS", "Found Vbox BIOS version")
  48.                         EndSelect
  49.                 Next
  50.         EndIf
  51.         ; 检查虚拟机主板/芯片组
  52.         $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Baseboard", "WQL", 0x10 + 0x20)
  53.         If IsObj($colItems) Then
  54.                 For $objItem In $colItems
  55.                         Select
  56.                                 Case StringInStr($objItem.Name, "Base Board") And StringInStr($objItem.Product, "440BX Desktop Reference Platform")
  57.                                         _AddVMHit($vmhit_count, $vmhit_details, "MOTHERBOARD", "Found VMware-style motherboard, ""440BX Desktop Reference Platform"" / Name=""Base Board""")
  58.                         EndSelect
  59.                 Next
  60.         EndIf
  61.         If $vmhit_count >= 2 Then
  62.                 Return $vmhit_details & @CRLF & @CRLF & "Hits in " & $vmhit_count & " of 4 hardware categories - probably a virtual machine."
  63.         Else
  64.                 Return ""
  65.         EndIf
  66. EndFunc   ;==>_CheckVM


  67. Func _AddVMHit(ByRef $vmhit_count, ByRef $vmhit_details, $this_hit_category, $this_hit_text)
  68.         If StringInStr($vmhit_details, "In CATEGORY:" & $this_hit_category & ":") Then
  69.                 $vmhit_details &= " and " & $this_hit_text
  70.         Else
  71.                 If $vmhit_details > "" Then $vmhit_details &= @CRLF
  72.                 $vmhit_details &= "In CATEGORY:" & $this_hit_category & ": " & $this_hit_text
  73.                 $vmhit_count += 1
  74.         EndIf
  75. EndFunc   ;==>_AddVMHit
复制代码
发表于 2013-2-5 22:13:58 | 显示全部楼层
也是老外写的,可以参考一下
  1. Opt("MustDeclareVars", 1)
  2. If _VCheck() Then
  3.         MsgBox(0, "", "True")
  4. Else
  5.         MsgBox(0, "", "False")
  6. EndIf

  7. Func _VCheck()
  8.         Local $strComputer = ".", $sMake, $sModel, $sBIOSVersion, $bIsVM, $sVMPlatform
  9.         Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
  10.         Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
  11.         If IsObj($colItems) Then
  12.                 For $objItem In $colItems
  13.                         ;MsgBox(0,"","Name: " & $objItem.Name)
  14.                         $sMake = $objItem.Manufacturer
  15.                         $sModel = $objItem.Model
  16.                 Next
  17.         EndIf

  18.         $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", 0x10 + 0x20)
  19.         If IsObj($colItems) Then
  20.                 For $objItem In $colItems
  21.                         ;MsgBox(0,"",$objItem.BIOSVersion(0))
  22.                         $sBIOSVersion = $objItem.SMBIOSBIOSVersion
  23.                 Next
  24.         EndIf

  25.         $bIsVM = False
  26.         $sVMPlatform = ""

  27.         MsgBox(0, "", "Manufacturer=" & $sMake)
  28.         MsgBox(0, "", "Model=" & $sModel)
  29.         MsgBox(0, "", "BIOSVersion=" & $sBIOSVersion)
  30.         If $sModel = "Virtual Machine" Then
  31.                 ; Microsoft virtualization technology detected, assign defaults
  32.                 $sVMPlatform = "Hyper-V"
  33.                 $bIsVM = True
  34.                 ; Try to determine more specific values
  35.                 Switch $sBIOSVersion
  36.                         Case "VRTUAL - 1000831"
  37.                                 $bIsVM = True
  38.                                 $sVMPlatform = "Hyper-V 2008 Beta or RC0"
  39.                         Case "VRTUAL - 5000805", "BIOS Date: 05/05/08 20:35:56  Ver: 08.00.02"
  40.                                 $bIsVM = True
  41.                                 $sVMPlatform = "Hyper-V 2008 RTM"
  42.                         Case "VRTUAL - 3000919"
  43.                                 $bIsVM = True
  44.                                 $sVMPlatform = "Hyper-V 2008 R2"
  45.                         Case "A M I  - 2000622"
  46.                                 $bIsVM = True
  47.                                 $sVMPlatform = "VS2005R2SP1 or VPC2007"
  48.                         Case "A M I  - 9000520"
  49.                                 $bIsVM = True
  50.                                 $sVMPlatform = "VS2005R2"
  51.                         Case "A M I  - 9000816", "A M I  - 6000901"
  52.                                 $bIsVM = True
  53.                                 $sVMPlatform = "Windows Virtual PC"
  54.                         Case "A M I  - 8000314"
  55.                                 $bIsVM = True
  56.                                 $sVMPlatform = "VS2005 or VPC2004"
  57.                 EndSwitch
  58.         ElseIf $sModel = "VMware Virtual Platform" Then
  59.                 ; VMware detected
  60.                 $sVMPlatform = "VMware"
  61.                 $bIsVM = True
  62.         ElseIf $sModel = "VirtualBox" Then
  63.                 ; VirtualBox detected
  64.                 $bIsVM = True
  65.                 $sVMPlatform = "VirtualBox"
  66.         Else
  67.         EndIf
  68.         If $bIsVM Then
  69.                 MsgBox(0, "", "IsVirtualMachine=True")
  70.                 MsgBox(0, "", "VirtualMachinePlatform=" & $sVMPlatform)
  71.         Else
  72.                 MsgBox(0, "", "IsVirtualMachine=False")
  73.         EndIf
  74.         Return $bIsVM
  75. EndFunc   ;==>_VCheck
复制代码
发表于 2013-2-6 10:29:47 | 显示全部楼层
强大的CIMV2
发表于 2013-2-9 11:23:56 | 显示全部楼层
楼上这个很好,vpc vmware都可判断!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|小黑屋|手机版|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2019-5-25 03:15 , Processed in 0.062500 second(s), 16 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表