-
February 1st, 2010, 09:10 PM
#1
How to retrieve hard drive temperature?
I am looking for a way to retrieve the temperature of hard drives in VB Express 2008. I have found posts at a few different places that accomplish this with the following:
Code:
Public Function GetDriveTemp() As Integer
Try
Dim searcher As New ManagementObjectSearcher("root\WMI", "SELECT * FROM MSStorageDriver_ATAPISmartData")
For Each queryObj As ManagementObject In searcher.Get()
Dim arrVendorSpecific As Byte() = queryObj("VendorSpecific")
GetDriveTemp = arrVendorSpecific(115
Next
Catch ex As ManagementException
MessageBox.Show(ex.Message)
End Try
End Function
This function retrieves the temperature for all the hard drives in my system (excluding USB), two internal and one external esata drive. There are two problems, tough:
1. I want to know the drive letter and maybe the drive label that the retrieved temperature corresponds to. I'm assuming that the * in the query, "SELECT * FROM MSStorageDriver_ATAPISmartData", can be changed to specify a particular drive rather than all drives, but I don't know how retrieve a list of all the drives in my system or how to write the query based on those results.
2. If I call the funciton from a some click event like for a label or button, there are no problems and the return value seems valid. But when I call the function from a Timer_Tick event, the mouse cursor is the busy cursor as long as the mouse is within the form, the form doesn't receive any click events, and it cannot be closed.
I know what I'm trying to do can be done because there are a few utilities that provide this information. So, does anyone have any ideas?
Last edited by HanneSThEGreaT; February 2nd, 2010 at 09:19 AM.
-
February 1st, 2010, 10:29 PM
#2
Re: How to retrieve hard drive temperature?
Check the drive MFG for their MOF file that you can use, or else, check this out:
http://www.hddtemp.com/
-
February 2nd, 2010, 09:21 AM
#3
Re: How to retrieve hard drive temperature?
pescadore, please use [CODE] [/CODE] tags when posting code, as stated here :
http://www.codeguru.com/forum/showthread.php?t=403073
Thanx
-
February 23rd, 2010, 09:22 AM
#4
Re: How to retrieve hard drive temperature?
Not sure exactly, but this seems to say something about my hd temp:
Code:
Imports System
Imports System.Management
Public Class Temperature
Public Function GetDriveTemp() As String
Dim retval As String = ""
Try
Dim searcher As New ManagementObjectSearcher("root\WMI", "Select * from MSAcpi_ThermalZoneTemperature")
Dim Counter As Integer = 1
For Each queryObj As ManagementObject In searcher.Get()
retval &= "DRIVE: " & Counter & "=" & GetCelsius(queryObj.GetPropertyValue("CurrentTemperature")).ToString("00.00")
Counter += 1
Next
Catch ex As ManagementException
MessageBox.Show(ex.Message)
End Try
Return retval
End Function
Private Function GetCelsius(ByVal fromKelvin As Single) As Single
Return (fromKelvin - 2732) / 10
End Function
End Class
...at present time, using mainly Net 4.0, Vs 2010
Special thanks to Lothar "the Great" Haensler, Chris Eastwood , dr_Michael, ClearCode, Iouri and
all the other wonderful people who made and make Codeguru a great place.
Come back soon, you Gurus.
-
February 23rd, 2010, 09:36 AM
#5
Re: How to retrieve hard drive temperature?
Funky!!! Good One!
Just a side not, in order to make use of the ManagementObject and the ManagementObjectSearcher you need to set a reference to System.Management, by clicking on Project, ProjectName proeprties, scroll for System.Management, OK.
-
February 23rd, 2010, 10:27 AM
#6
Re: How to retrieve hard drive temperature?
...might be I got cpu temp, instead of hd temp...
I made a second function (and changed the name of the first)
they retrieve slightly different values...
Code:
Imports System
Imports System.Management
Public Class Temperature
Public Function GetCpuTemp() As String
Dim retval As String = ""
Try
Dim searcher As New ManagementObjectSearcher("root\WMI", "Select * from MSAcpi_ThermalZoneTemperature")
Dim Counter As Integer = 1
For Each queryObj As ManagementObject In searcher.Get()
retval &= "Cpu: " & Counter & "=" & GetCelsius(queryObj.GetPropertyValue("CurrentTemperature")).ToString("00.00")
Counter += 1
Next
Catch ex As ManagementException
MessageBox.Show(ex.Message)
End Try
Return retval
End Function
Private Function GetCelsius(ByVal fromKelvin As Single) As Single
Return (fromKelvin - 2732) / 10
End Function
Public Function GetDriveTemp() As String
Dim retval As String = "Temp: "
Try
Dim counter As Integer = 1
Dim searcher As New ManagementObjectSearcher( _
"root\WMI", _
"SELECT * FROM MSStorageDriver_ATAPISmartData")
For Each queryObj As ManagementObject In searcher.Get()
Dim arrVendorSpecific As Byte() = queryObj("VendorSpecific")
retval &= "DRIVE: " & Counter & "=" & arrVendorSpecific(115)
counter += 1
Next
Catch err As ManagementException
MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
End Try
Return retval
End Function
End Class
Last edited by Cimperiali; February 23rd, 2010 at 10:36 AM.
...at present time, using mainly Net 4.0, Vs 2010
Special thanks to Lothar "the Great" Haensler, Chris Eastwood , dr_Michael, ClearCode, Iouri and
all the other wonderful people who made and make Codeguru a great place.
Come back soon, you Gurus.
-
February 23rd, 2010, 10:46 AM
#7
Re: How to retrieve hard drive temperature?
still not able to get the name of the Hd as you would recognize it.
The closest thing I can get is the name of the hardware:
Code:
retval &= "DRIVE: " & queryObj.GetPropertyValue("InstanceName") & "=" & arrVendorSpecific(115)
...at present time, using mainly Net 4.0, Vs 2010
Special thanks to Lothar "the Great" Haensler, Chris Eastwood , dr_Michael, ClearCode, Iouri and
all the other wonderful people who made and make Codeguru a great place.
Come back soon, you Gurus.
-
February 24th, 2010, 04:22 PM
#8
Re: How to retrieve hard drive temperature?
I think I got it...a sort of: on my pc I get the drive temp and letter associated with instanceName, but had to trick a bit (had to remove 2 bytes from instancename, and do not know if it might be valid for any disk)
Give it a try, and tell us if you find or work out a better way.
Code:
Public Function GetDriveTemp() As String
Dim retval As String = "Temp: "
Try
'Dim counter As Integer = 1
Dim searcher As New ManagementObjectSearcher( _
"root\WMI", _
"SELECT * FROM MSStorageDriver_ATAPISmartData")
For Each queryObj As ManagementObject In searcher.Get()
Debug.Print(queryObj.GetText(TextFormat.WmiDtd20))
Dim arrVendorSpecific As Byte() = queryObj("VendorSpecific")
'retval &= "DRIVE: " & queryObj.GetPropertyValue("InstanceName") & "=" & arrVendorSpecific(115)
'counter += 1
retval &= "DRIVE: " & instanceNameToDriveLetter(queryObj.GetPropertyValue("InstanceName")) & "=" & arrVendorSpecific(115)
Next
Catch err As ManagementException
MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
End Try
Return retval
End Function
Private Function instanceNameToDriveLetter(ByVal Instancename As String) As String
Dim sb As New System.Text.StringBuilder()
' on my os and with my disk, the instancename has 2 extra chars ("_0")
Instancename = Instancename.Substring(0, Instancename.Length - 2)
'----------
Dim DiskDriveSearcher As New ManagementObjectSearcher("\root\cimv2", _
"Select PNPDeviceID, DeviceID from Win32_DiskDrive where PNPDeviceID = '" & Instancename.Replace("\", "\\") & "'")
For Each queryObj As ManagementObject In DiskDriveSearcher.Get()
Debug.Print(Instancename)
Debug.Print(queryObj.GetPropertyValue("PNPDeviceID"))
Debug.Print(queryObj.GetPropertyValue("DeviceID"))
Debug.Print("-----------")
Dim PartitionSearcher As New ManagementObjectSearcher("\root\cimv2", _
"ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & queryObj.GetPropertyValue("DeviceID") & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
For Each subQObj As ManagementObject In PartitionSearcher.Get()
Debug.Print(subQObj.GetPropertyValue("DeviceID"))
'Debug.Print(subQObj.GetText(TextFormat.WmiDtd20))
Dim LogicalPSearcher As New ManagementObjectSearcher _
("\root\cimv2", _
"ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _
& subQObj.GetPropertyValue("DeviceID") & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
For Each subQLogical In LogicalPSearcher.Get()
sb.Append(subQLogical.GetPropertyValue("DeviceID"))
Debug.Print(sb.ToString)
Next
Next
Next
Return sb.ToString
End Function
...at present time, using mainly Net 4.0, Vs 2010
Special thanks to Lothar "the Great" Haensler, Chris Eastwood , dr_Michael, ClearCode, Iouri and
all the other wonderful people who made and make Codeguru a great place.
Come back soon, you Gurus.
-
February 4th, 2014, 06:18 AM
#9
Re: How to retrieve hard drive temperature?
Hello everybody, I'm a system administrator and usually I use batch script to get information about system.
After that I make targeted statistics using RRDTool (round-robin database tool)
I'm looking for a piece of code in VBScript to get with WMI method only HD Temperature
I use this script that is quite similar to first example
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\WMI")
Set colItems = objWMIService.ExecQuery( "SELECT * FROM MSStorageDriver_ATAPISmartData",,48)
For Each objItem in colItems
If isNull(objItem.VendorSpecific) Then
Wscript.Echo "VendorSpecific: "
Else
WScript.Echo "VendorSpecific: " & Join(objItem.VendorSpecific, ",")
End If
Next
but the return is:
VendorSpecific: 16,0,1,11,0,100,100,0,0,0,0,0,0,0,2,5,0,100,100,0,0,0,0,0,0,0,3,7,0,172,172,1,0,0,0,13,0,0,4,18,0,100,100,27,1,0,0,0,0,0,5,5
1,0,100,100,0,0,0,0,0,0,0,7,11,0,100,100,0,0,0,0,0,0,0,8,5,0,100,100,0,0,0,0,0,0,0,9,18,0,85,85,69,27,0,0,0,0,0,10,19,0,100,100,0,0,0,0,0,0,
0,12,50,0,100,100,144,0,0,0,0,0,0,191,10,0,100,100,0,0,0,0,0,0,0,192,50,0,100,100,68,0,0,0,0,0,0,193,18,0,97,97,81,149,0,0,0,0,0,194,2,0,127
,127,47,0,18,0,52,0,0,196,50,0,100,100,0,0,0,0,0,0,0,197,34,0,100,100,0,0,0,0,0,0,0,198,8,0,100,100,0,0,0,0,0,0,0,199,10,0,200,200,0,0,0,0,0
,0,0,223,10,0,100,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0
I want get only value 47 placed at position 165
Thanks in advance and regards
Dario
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|