Temperatur von CPU sowie anderen Hardware-Komponenten ermitteln (verschiedene Methoden)

    • VB.NET
    • .NET (FX) 3.0–3.5

      Temperatur von CPU sowie anderen Hardware-Komponenten ermitteln (verschiedene Methoden)

      Hallo liebe Community, und liebe Leser!
      In dieser kleinen Anleitung werde ich Ihnen zeigen wie Sie auf verschiedenste Methoden die Temperaturen von bestimmten Hardware-Komponenten ermitteln können.
      Aufgrund mehrerer Probleme und mangels Alternativen ist dieses Tutorial entstanden.

      Allgemeines
      Dieses Tutorial fokusiert sich grundsätzlich auf das Auslesen der Temperatur der CPU,
      trotzdem sind die Methoden grundsätzlich (mit ein paar Ausnahmen) auch auf andere Komponenten anwendbar.
      Dies ist natürlich nur der Fall sofern die Komponente den benötigten Sensor besitzt.

      Ich werde Ihnen in dieser Anleitung mehrere unterschiedliche Methoden zeigen, die alle unterschiedliche Vorraussetzungen benötigen,
      doch dazu später mehr. Fangen wir an!





      Methode 1 - Auslesen der Temperatur mittels Windows Management Instrumentation (WMI)

      Grundvorraussetzungen:
      Die Methode mittels WMI setzt das Einbinden bzw. Vorhandensein der System.Management.dll vorraus.
      Diese ist ab .NET Framework 3.0 standardmäßig vorhanden, davor kann sie manuell importiert werden.

      Literatur:
      MSDN: msdn.microsoft.com/en-us/libra…op/aa394582(v=vs.85).aspx
      Wikipedia: en.wikipedia.org/wiki/Windows_Management_Instrumentation
      VB-Paradise: Systeminformationen mit WMI auslesen ab .NET 3.0 oder früher

      Zu Beginn müssen Sie den Verweiß auf die System.Management.dll setzen.
      Im Anschluss sollten Sie (der Einfachheit) die Library mittels Import System.Management importieren.

      Nun muss ein ObjectSearcher Objekt erstellt werden, und diesem ein bestimmter Querystring übergeben werden.
      Anschließend darin weiter nach der Temperatur gesucht werden:

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Ermittelt die derzeitige Durchschnittstemperatur der CPU mittels WMI.
      3. ''' </summary>
      4. Private Function GetCPUTemperatureWithWMI() As Double
      5. Try
      6. Dim TempSearcher As New Management.ManagementObjectSearcher( _
      7. "root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature")
      8. Dim Temperature As Double = 0
      9. For Each TempSensor As Management.ManagementObject In TempSearcher.Get()
      10. Temperature = CDbl(TempSensor("CurrentTemperature")) : Exit For
      11. Next
      12. Return (Temperature - 2732) / 10.0 'Umrechnung in Celsius
      13. Catch err As Management.ManagementException
      14. Return -1 '-1 wird zurückgegeben wenn die Funktion nicht unterstützt wird!
      15. End Try
      16. End Function


      Sollte es zu einem Fehler kommen, gibt die Funktion ein Objekt vom Typ Double mit dem Wert -1 zurück.
      Dies ist unter anderem der Fall wenn der von WMI verwendete Sensor nicht unterstützt wird.


      Methode 2 - Auslesen der Temperatur mittels CoreTemp

      Grundvorraussetzungen:
      Hier greifen wir auf das externe Programm CoreTemp zurück, und verwenden die mitgelieferte GetCoreTempInfoNet.dll (zu finden im Anhang).
      Problematisch ist, dass bei dieser Methode die Anwendung gestartet werden, sowie, zum Zeitpunkt der Überprüfung laufen muss.
      Es wird also eine laufende CoreTemp Instanz benötigt.

      Externe Anwendung:
      alcpu.com/CoreTemp/

      Die ersten Schritte sind ähnlich wie bei Methode 1.
      Sie müssen den Verweis setzen, beziehungsweise sollten die Library importieren. ( Imports GetCoreTempInfoNET )

      Nun kann die durchschnittliche Temperatur aller Kerne wie folgt ermittelt werden:

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Ermittelt die derzeitige Durchschnittstemperatur der CPU mittels CoreTemp.
      3. ''' </summary>
      4. Private Function GetCPUTemperatureWithCoreTemp() As Double
      5. Dim CTInfo As New CoreTempInfo
      6. CTInfo.GetData()
      7. Dim temp As Double = -1 '-1 wird zurückgegeben wenn die Funktion nicht unterstützt wird, _
      8. ' oder CoreTemp nicht im Hintergrund läuft!
      9. If CTInfo.GetTemp IsNot Nothing Then
      10. For i As Integer = 0 To CTInfo.GetTemp.Count - 1
      11. temp += CTInfo.GetTemp(i)
      12. Next
      13. temp /= CTInfo.GetCoreCount ' Durchschnittswert errechnen.
      14. End If
      15. Return temp
      16. End Function


      Einzelne Kerntemperaturen können mittels, CTInfo.GetTemp(0), wobei der Integer den gewünschten Kern angibt, ausgelesen werden.

      Als kleiner Trick kann die Anwendung vor dem Verwenden der Methode noch im versteckten Modus gestartet werden:

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Startet die Anwendung CoreTemp im verstecken Modus.
      3. ''' </summary>
      4. ''' <param name="filename">Pfad zur CoreTemp.exe (standardmäßig im Dateiordner) dieser Anwendung.</param>
      5. Private Sub PrelaunchCoreTemp(Optional ByVal filename As String = "Core Temp.exe")
      6. If IO.File.Exists(filename) Then
      7. Dim pInfo As New ProcessStartInfo With {.WindowStyle = ProcessWindowStyle.Hidden, .FileName = filename}
      8. Process.Start(pInfo)
      9. End If
      10. End Sub



      Methode 3 - Auslesen der Temperatur mittels OpenHardwareMonitor und ohne externe Anwendung

      Grundvorraussetzungen:
      Methode 3 setzt das Einbinden der vom OpenHardewareMonitor bereitgestellten Library vorraus.
      Die .dll kann einfach ohne der Anwendung eingebunden werden.
      Sie setzt lediglich das starten der Anwendung als Administrator vorraus. (diesbezüglich siehe: vb-paradise.de/allgemeines/tip…stratorrechte-und-vb-net/ )

      Literatur:
      openhardwaremonitor.org/documentation/

      Der OpenHardwareMonitor ist eine weitere externe Anwendung, welche in diesem Fall jedoch nicht mitgeliefert beziehungsweise laufen muss.
      Die mitgelieferte Bibliothek, -OpenHardwareMonitorLib.dll-, muss wie bei den vorherigen Methoden mittels Verweiß eingebunden werden.
      Im Anschluss ist das Setzten der Importe OpenHardwareMonitor und OpenHardwareMonitor.Hardware ratsam.

      Wie folgt kann nun die Durchschnittstemperatur der CPU ermittelt werden:

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Ermittelt die derzeitige Durchschnittstemperatur der CPU mittels OpenHardwareMonitor.
      3. ''' </summary>
      4. Private Function GetCPUTemperatureWithOHM() As Double
      5. Dim c As New Computer()
      6. c.Open()
      7. c.CPUEnabled = True 'In diesem Fall da wir lediglich Informationen der CPU auslesen wollen.
      8. Dim temp As Double = -1 '-1 wird zurückgegeben wenn die Funktion nicht unterstützt wird.
      9. For i As Integer = 0 To c.Hardware.Count - 1
      10. Dim hw = c.Hardware(i)
      11. If hw.HardwareType = HardwareType.CPU Then
      12. For j As Integer = 0 To hw.Sensors.Count - 1
      13. Dim sensor = hw.Sensors(j)
      14. If sensor.SensorType = 3 Then 'Abfrage ob Typ dem Typen Temperature entspricht.
      15. 'OHM hat hier ein gelegentlich ein Problem beim Auslesen der Temperatur einzelner Kerne.
      16. 'Der Sensor mit dem Namen CPU Total gibt den von uns gesuchten Wert daher manchmal falsch zurück.
      17. If sensor.Name = "CPU Total" Then temp = CDbl(sensor.Value) : Exit For
      18. End If
      19. Next
      20. End If
      21. Next
      22. Return temp
      23. End Function


      Wie im Codebeispiel jedoch beschrieben kann es hier ab und zu, zu Problemen beim Auslesen der einzelnen Temperaturen kommen.





      Temperaturen anderer Hardware-Komponenten ermitteln
      Das Ermitteln von Temperaturen anderer Hardware-Komponenten ist natürlich ebenfalls möglich.
      Grundsätzlich können als Ansatz die oben genannten Methoden verwendet werden.
      Mit OHM kann zum Beispiel einfach die GPU Temperatur ausgelesen werden:

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Ermittelt die derzeitige Durchschnittstemperatur der GPU mittels OpenHardwareMonitor.
      3. ''' </summary>
      4. Private Function GetGPUTemperatureWithOHM() As Double
      5. Dim c As New Computer()
      6. c.Open()
      7. c.GPUEnabled = True 'In diesem Fall da wir lediglich Informationen der GPU auslesen wollen.
      8. Dim temp As Double = -1 '-1 wird zurückgegeben wenn die Funktion nicht unterstützt wird.
      9. For i As Integer = 0 To c.Hardware.Count - 1
      10. Dim hw = c.Hardware(i)
      11. If hw.HardwareType = HardwareType.GpuNvidia Then
      12. For j As Integer = 0 To hw.Sensors.Count - 1
      13. Dim sensor = hw.Sensors(j)
      14. If sensor.SensorType = 3 Then 'Abfrage ob Typ dem Typen Temperature entspricht.
      15. temp = CDbl(sensor.Value)
      16. End If
      17. Next
      18. End If
      19. Next
      20. Return temp
      21. End Function


      Beachten sollte man hierbei, dass es eine Unterscheidung zwischen ATI und NVIDIA Grafikkarten gibt.
      Speziell für NVIDIA gibt es weitere Methoden:

      VB.NET-Quellcode

      1. Public Declare Function NvCplGetThermalSettings Lib "nvcpl.dll" ( _
      2. ByVal nWindowsMonitorNumber As Integer, _
      3. ByRef pdwCoreTemp As Integer, _
      4. ByRef pdwAmbientTemp As Integer, _
      5. ByRef pdwUpperLimit As Integer) _
      6. As Long
      7. Public Function GetNvidiaTemp() As Long()
      8. Dim TempArray(2) As Long
      9. NvCplGetThermalSettings(0, TempArray(0), TempArray(1), TempArray(2))
      10. Return TempArray
      11. End Function
      Quelle: dotnet-snippets.de/snippet/nvi…entemperatur-auslesen/139

      Das Auslesen der Temperatur einer Festplatte ist ebenfalls möglich.
      Dazu kann zum Beispiel WMI (mittels root\WMI Namespace und der Klasse MSStorageDriver_ATAPISmartData) verwendet werden.
      Desweiteren gibt es diesbezüglich diverse Bibliotheken welche auf S.M.A.R.T aufbauen.

      Mehr dazu: vbnet.mvps.org/index.html?code/disk/smartide.htm




      Welche Methode ist nun die Beste?
      Welche der angebenen Methoden nun die Beste ist, ist schwer zu beantworten da alle prinzipiell ihre Vor- und Nachteile besitzen.
      Bei meinem Test haben sich folgende Ergebnise evaluieren lassen:

      Quellcode

      1. OpenHardwareMonitor: 33,333324432373
      2. CoreTemp: 33,5
      3. WMI: -1 (Nicht untersützt!)


      Problematisch ist jedoch, dass OHM keine konstanten richtigen Ergebnisse bei mir geliefert hat, da es öfters zu Komplikationen beim Auslesen der Temperaturen für einzelne Kerne kam.
      Durchgehen richtige Ergebnisse hingegen lieferte CoreTemp. Der offensichtliche Nachteil jedoch ist, dass diese Methode eine laufende Instanz benötigt.


      Ich hoffe dieses Tutorial hat Ihnen geholfen!
      Mit freundlichen Grüßen

      Martin Pfeiffer aka. Gather_
      Mfg: Gather
      Private Nachrichten bezüglich VB-Fragen werden Ignoriert!