In my computer I am trying to get the CPU temperature. Searching on StackOverflow I found this:
C:\WINDOWS\system32>wmic /namespace:\\root\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature But I get this error:
Node - ADMIN ERROR: Description = Not supported 16 Answers
you can use this code :
function Get-Temperature { $t = Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi" $returntemp = @() foreach ($temp in $t.CurrentTemperature) { $currentTempKelvin = $temp / 10 $currentTempCelsius = $currentTempKelvin - 273.15 $currentTempFahrenheit = (9/5) * $currentTempCelsius + 32 $returntemp += $currentTempCelsius.ToString() + " C : " + $currentTempFahrenheit.ToString() + " F : " + $currentTempKelvin + "K" } return $returntemp } Get-Temperature 2You can get the CPU temp in both WMI and Open Hardware Monitor way.
Open Hardware Monitor:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenHardwareMonitor.Hardware; namespace Get_CPU_Temp5 { class Program { public class UpdateVisitor : IVisitor { public void VisitComputer(IComputer computer) { computer.Traverse(this); } public void VisitHardware(IHardware hardware) { hardware.Update(); foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this); } public void VisitSensor(ISensor sensor) { } public void VisitParameter(IParameter parameter) { } } static void GetSystemInfo() { UpdateVisitor updateVisitor = new UpdateVisitor(); Computer computer = new Computer(); computer.Open(); computer.CPUEnabled = true; computer.Accept(updateVisitor); for (int i = 0; i < computer.Hardware.Length; i++) { if (computer.Hardware[i].HardwareType == HardwareType.CPU) { for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++) { if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature) Console.WriteLine(computer.Hardware[i].Sensors[j].Name + ":" + computer.Hardware[i].Sensors[j].Value.ToString() + "\r"); } } } computer.Close(); } static void Main(string[] args) { while (true) { GetSystemInfo(); } } } } WMI:
using System; using System.Diagnostics; using System.Management; class Program { static void Main(string[] args) { Double CPUtprt = 0; System.Management.ManagementObjectSearcher mos = new System.Management.ManagementObjectSearcher(@"root\WMI", "Select * From MSAcpi_ThermalZoneTemperature"); foreach (System.Management.ManagementObject mo in mos.Get()) { CPUtprt = Convert.ToDouble(Convert.ToDouble(mo.GetPropertyValue("CurrentTemperature").ToString()) - 2732) / 10; Console.WriteLine("CPU temp : " + CPUtprt.ToString() + " °C"); } } } I found a nice tutorial here, I get the CPU temp successfully.
You can use Open Hardware Monitor it's an open source software (MPL v2). You can access the command line version here:
Example part of the output:
PS C:\Users\myuser\OpenHardwareMonitorReport> .\OpenHardwareMonitorReport.exe Open Hardware Monitor Report -------------------------------------------------------------------------------- Version: 0.8.0.2 -------------------------------------------------------------------------------- Common Language Runtime: 4.0.30319.42000 Operating System: Microsoft Windows NT 6.2.9200.0 Process Type: 32-Bit -------------------------------------------------------------------------------- Sensors | +- HP 00F52W (/mainboard) | +- Intel Core i7-3770 (/intelcpu/0) | +- Bus Speed : 99.7734 99.7734 99.7784 (/intelcpu/0/clock/0) | +- CPU Core #1 : 3691.62 3691.62 3791.58 (/intelcpu/0/clock/1) | +- CPU Core #2 : 3691.62 3691.62 3791.58 (/intelcpu/0/clock/2) | +- CPU Core #3 : 3791.39 3791.39 3891.36 (/intelcpu/0/clock/3) | +- CPU Core #4 : 3691.62 3691.62 3891.36 (/intelcpu/0/clock/4) | +- CPU Core #1 : 42 42 43 (/intelcpu/0/temperature/0) | +- CPU Core #2 : 43 37 43 (/intelcpu/0/temperature/1) | +- CPU Core #3 : 42 35 42 (/intelcpu/0/temperature/2) | +- CPU Core #4 : 45 41 45 (/intelcpu/0/temperature/3) | +- CPU Package : 45 43 45 (/intelcpu/0/temperature/4) - Open Hardware Monitor Official website
- link to issue where the command line version is linked: #776
- Pending pull request with more recent version:
Run the following command in Command Prompt as an Administrator:
wmic /namespace:\\root\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature
This will give you some output like this:
CurrentTemperature 3000 3010
But make sure that you are running the cmd as an Administrator
2On my laptop all above gave me wrong results. Only this one was showing the CPU-Temperature in Celsius:
$data = Get-WMIObject -Query "SELECT * FROM Win32_PerfFormattedData_Counters_ThermalZoneInformation" -Namespace "root/CIMV2" @($data)[0].HighPrecisionTemperature I guess, that each CPU-version may have a different place/formular to get the correct CPU-temperature.
With new sensor, or with what I have and with elevation. It also shows critical temperature and percentage (in Celsius) It leaves a file Temperatures.txt for easy debugging, and the xml with serialized object from sensors
function Get-Temperature { $TempFormat = "#" $TempFile = "temperature" $Command = 'Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi" ' + " > $pwd\$TempFile.txt" $Command = 'Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi" ' + " | Export-Clixml $pwd\$TempFile.xml" $p = Start-Process -Verb runas -FilePath "powershell" -ArgumentList $command -WorkingDirectory $pwd -PassThru $p.WaitForExit() $t = Import-Clixml pippo.xml $returntemp = @() foreach ($Sensor in $t) { $Active = if($sensor.Active){"On "}else{"Off"} $temp = $Sensor.CurrentTemperature $Critical = $Sensor.CriticalTripPoint $currentTempKelvin = $temp / 10 $currentTempCelsius = $currentTempKelvin - 273.15 $currentTempFahrenheit = (9/5) * $currentTempCelsius + 32 $StrKelvin = $currentTempKelvin.ToString($TempFormat).PadLeft(3, " ") $StrCelsius = $currentTempCelsius.ToString($TempFormat).PadLeft(3, " ") $StrFahrenheit = $currentTempFahrenheit.ToString($TempFormat).PadLeft(3, " ") $CriticalKelvin = $Critical / 10 $CriticalCelsius = $CriticalKelvin - 273.15 $CriticalFahrenheit = (9/5) * $CriticalCelsius + 32 $StrCritKelvin = $CriticalKelvin.ToString($TempFormat).PadRight(3, " ") $StrCritCelsius = $CriticalCelsius.ToString($TempFormat).PadRight(3, " ") $StrCritFahrenheit = $CriticalFahrenheit.ToString($TempFormat).PadRight(3, " ") $PerCrit = ($currentTempCelsius/$CriticalCelsius * 100) $StrPerCrit = $PerCrit.ToString($TempFormat).PadLeft(3, " ") $returntemp += "$Active $StrPerCrit% $StrCelsius/$StrCritCelsius C : $StrFahrenheit/$StrCritFahrenheit F : $StrKelvin/$StrCritKelvin K - " + $Sensor.InstanceName } return $returntemp } Get-Temperature 1