PowerShellでCPU温度をモニタリングする方法

MSAcpi_ThermalZoneTemperatureとvendor sensorを使う前に、端末がどの実装を呼び、どの対象を読むかを確認してください。PowerShellでCPU温度をモニタリングする方法の結論は「PowerShellだけで全PCのCPU温度を正確に取る標準cmdletはありません。MSAcpi_ThermalZoneTemperatureは利用可否とsensor identityを確認する参考値に留め、hardware vendorの管理APIや監視agentを優先します。」。Windows標準classは機種により未実装で、返るthermal zoneがCPU package温度とは限らない環境で、未確認の変更を避けるための順番を示します。

目次

ACPI thermal zone classの有無を調べる

CPU温度は、すべてのPCでWindowsの標準CIMクラスから取得できるわけではありません。root/wmiのMSAcpi_ThermalZoneTemperatureが返る機種だけを対象に、InstanceNameと生値の単位を確認し、摂氏へ変換します。値が空、不変、異常範囲ならメーカーの監視機能を使い、推定値を実測として記録しません。

  • Get-CimClass root/wmiでclass存在を確認する
  • 複数thermal zoneのInstanceNameとsampling可能性を確認する
  • vendor BIOS/management toolのsensor名と照合する
  • 温度閾値、sampling間隔、log保持先を運用で定義する

CurrentTemperatureの単位を摂氏へ変換する

class存在を読む

Get-CimClass -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction SilentlyContinue

classなしはPowerShell不具合ではなくfirmware/provider非対応の場合があります。

全thermal zoneを表示

Get-CimInstance -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction SilentlyContinue |
  Select-Object InstanceName,CurrentTemperature,CriticalTripPoint

一件目だけをCPU温度と断定しません。

Kelvin tenthを摂氏へ変換

Get-CimInstance -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature |
  Select-Object InstanceName,@{n='Celsius';e={[math]::Round(($_.CurrentTemperature/10)-273.15,1)}}

raw値が10分のKelvinというclass仕様に基づく換算です。sensor identityの問題は換算で解決しません。

thermal zoneを60秒だけsample

1..6 | ForEach-Object {
  $now=Get-Date
  Get-CimInstance -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction SilentlyContinue |
    Select-Object @{n='Time';e={$now}},InstanceName,CurrentTemperature
  Start-Sleep -Seconds 10
}

無限loopを避け、まず一分のsampleで値が変化するか確認します。

CPU loadと同時刻に記録

Get-Counter '\Processor(_Total)\% Processor Time' -SampleInterval 2 -MaxSamples 5

温度との相関を見る補助です。CPU counterだけでsensorの正しさを証明しません。

thermal zoneをCPU package温度と断定しない

読取は通常安全ですが、高頻度pollingや無限loopはWMI providerとlog diskへ負荷をかけます。sampling数と間隔、timeout、log rotationを設定します。温度を下げるためにsecurity serviceやfan制御を無効化せず、異常時はworkload停止、冷却・dust・firmware確認をhardware手順で行います。sensor tool導入はpublisherと署名を確認し、uninstallと設定rollbackを用意します。

sampling回数と間隔に上限を置く

CurrentTemperatureが一定、空、極端でもCPU故障と断定しません。ACPI thermal zoneはmotherboardやchassis zoneの場合があります。modern CPUにはpackage/core別sensorがあり、vendor APIの名称と単位を確認します。閾値はCPU model、冷却設計、workloadに依存し、一般値をalarmへ固定しません。

CPU loadと温度を同時刻で相関する

  • thermal zoneをCPU packageと断定する
  • 2732を引く式だけを正しさの根拠にする
  • 無限loopでlogを増やす
  • 一つの固定閾値を全機種へ使う
  • 非公式sensor driverを無検証で導入する

classなし環境ではvendor telemetryへ切り替える

BIOS hardware monitorまたはvendor management consoleと同時刻に比較し、InstanceNameごとにidle/load時の変化を見ます。classなし、null、複数zoneを正常な状態として処理できるscriptにします。取得不能なら推測値を出さずunsupportedと記録します。

zone identityと現実的な温度範囲を検収する

MSAcpi_ThermalZoneTemperatureは一部hardwareが公開するACPI thermal zoneで、CPU package温度を必ず返すAPIではありません。CurrentTemperatureは0.1 Kelvinなので摂氏へ変換し、classなし・0件・invalid値を『CPU 0度』に置換しません。

ACPI raw値を摂氏へ変換して保存する

$zones=@(Get-CimInstance -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction Stop)
$zones | ForEach-Object { $c=($_.CurrentTemperature/10)-273.15; [pscustomobject]@{Zone=$_.InstanceName;Raw=$_.CurrentTemperature;Celsius=[math]::Round($c,1);Valid=($c -gt -50 -and $c -lt 150)} }

thermal zone非対応をCIM例外から判断する

  • thermal zone取得:各InstanceNameのraw値が妥当範囲にあり、Celsius=(raw/10)-273.15で時系列を得る
  • class非対応:classなし/0件はUnsupportedOrUnavailableとして明示し、温度正常と判定しない
  • CIM・値域error:Access denied、provider error、raw値0や異常範囲はRejectedSampleとして別件数にする

thermal zone名はCPU coreと一対一ではなく、firmware/virtual machineで値が無いことがあります。単発値からthrottlingを断定せず、vendor telemetryやBIOS sensorと照合します。無限loopで高頻度pollingしません。

異常raw値と複数zoneを試す

try { $class=Get-CimClass -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction Stop; [pscustomobject]@{State='ClassAvailable';Name=$class.CimClassName} } catch { [pscustomobject]@{State='UnsupportedOrUnavailable';Category=$_.CategoryInfo.Category} }

classなし、0 zone、複数zone、raw 0、sampling中消失をtestします。zone名、raw/Celsius、取得時刻、sample間隔、CPU loadを保存し、別sensorとの差を記録します。

MSAcpi_ThermalZoneTemperatureが返すのはfirmware公開のthermal zoneで、CPU core温度とは限りません。zone名、raw値、変換式を残し、取得不能を0℃として記録しないでください。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次