@@ -28,49 +28,73 @@ module supports detection of Hyper-V, VMWare, Virtual PC,
28
28
# Method for detecting if it is a Hyper-V VM
29
29
def hypervchk ( session )
30
30
vm = false
31
- sfmsvals = registry_enumkeys ( 'HKLM\SOFTWARE\Microsoft' )
32
- if sfmsvals and sfmsvals . include? ( "Hyper-V" )
33
- vm = true
34
- elsif sfmsvals and sfmsvals . include? ( "VirtualMachine" )
35
- vm = true
31
+
32
+ physicalHost = registry_getvaldata ( 'HKLM\SOFTWARE\Microsoft\Virtual Machine\Guest\Parameters' , 'PhysicalHostNameFullyQualified' )
33
+ if physicalHost
34
+ vm = true
35
+ report_note (
36
+ :host => session ,
37
+ :type => 'host.physicalHost' ,
38
+ :data => { :physicalHost => physicalHost } ,
39
+ :update => :unique_data
40
+ )
36
41
end
42
+
37
43
if not vm
38
- if registry_getvaldata ( 'HKLM\HARDWARE\DESCRIPTION\System' , 'SystemBiosVersion' ) =~ /vrtual/i
44
+ sfmsvals = registry_enumkeys ( 'HKLM\SOFTWARE\Microsoft' )
45
+ if sfmsvals and sfmsvals . include? ( "Hyper-V" )
46
+ vm = true
47
+ elsif sfmsvals and sfmsvals . include? ( "VirtualMachine" )
48
+ vm = true
49
+ elsif registry_getvaldata ( 'HKLM\HARDWARE\DESCRIPTION\System' , 'SystemBiosVersion' ) =~ /vrtual/i
39
50
vm = true
40
51
end
41
52
end
53
+
42
54
if not vm
43
55
srvvals = registry_enumkeys ( 'HKLM\HARDWARE\ACPI\FADT' )
44
56
if srvvals and srvvals . include? ( "VRTUAL" )
45
57
vm = true
58
+ else
59
+ srvvals = registry_enumkeys ( 'HKLM\HARDWARE\ACPI\RSDT' )
60
+ if srvvals and srvvals . include? ( "VRTUAL" )
61
+ vm = true
62
+ end
46
63
end
47
64
end
65
+
48
66
if not vm
49
- srvvals = registry_enumkeys ( 'HKLM\HARDWARE\ACPI\RSDT ' )
50
- if srvvals and srvvals . include? ( "VRTUAL " )
67
+ srvvals = registry_enumkeys ( 'HKLM\SYSTEM\ControlSet001\Services ' )
68
+ if srvvals and srvvals . include? ( "vmicexchange " )
51
69
vm = true
70
+ else
71
+ key_path = 'HKLM\HARDWARE\DESCRIPTION\System'
72
+ systemBiosVersion = registry_getvaldata ( key_path , 'SystemBiosVersion' )
73
+ if systemBiosVersion . unpack ( "s<*" ) . reduce ( '' , :<< ) . include? "Hyper-V"
74
+ vm = true
75
+ end
52
76
end
53
77
end
78
+
54
79
if not vm
55
- srvvals = registry_enumkeys ( 'HKLM\SYSTEM\ControlSet001\Services' )
56
- if srvvals and srvvals . include? ( "vmicheartbeat" )
57
- vm = true
58
- elsif srvvals and srvvals . include? ( "vmicvss" )
59
- vm = true
60
- elsif srvvals and srvvals . include? ( "vmicshutdown" )
61
- vm = true
62
- elsif srvvals and srvvals . include? ( "vmicexchange" )
80
+ key_path = 'HKLM\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0'
81
+ if registry_getvaldata ( key_path , 'Identifier' ) =~ /Msft Virtual Disk 1.0/i
63
82
vm = true
64
83
end
65
84
end
85
+
66
86
if vm
67
87
report_note (
68
88
:host => session ,
69
89
:type => 'host.hypervisor' ,
70
90
:data => { :hypervisor => "MS Hyper-V" } ,
71
91
:update => :unique_data
72
92
)
73
- print_good ( "This is a Hyper-V Virtual Machine" )
93
+ if physicalHost
94
+ print_good ( "This is a Hyper-V Virtual Machine running on physical host #{ physicalHost } " )
95
+ else
96
+ print_good ( "This is a Hyper-V Virtual Machine" )
97
+ end
74
98
return "MS Hyper-V"
75
99
end
76
100
end
0 commit comments