English summary: Drop-in replacement for the
OpenHardwareMonitorCLI.exeused by the Checkmk Windows agent (sectionopenhardwaremonitor), based on the actively developed LibreHardwareMonitor and the signed PawnIO driver instead of the vulnerable WinRing0 driver (CVE-2020-14979). Same file names (OpenHardwareMonitorCLI.exe+OpenHardwareMonitorLib.dll, deployable with the existing bakery rule), same WMI namespace and classes (root\OpenHardwareMonitor), OHM-compatible identifiers so existing service names stay. Requires Windows x64, .NET Framework 4.7.2 and PawnIO (winget install namazso.PawnIO). Prebuilt files: see Releases or the artifacts of the build workflow. Related idea: Replace Open Hardware Monitor with LibreHardwareMonitor.Checkmk team: you are explicitly welcome to use this code to bring LibreHardwareMonitor support back into Checkmk officially – see For the Checkmk team.
Ein headless Ersatz für die OpenHardwareMonitorCLI.exe, die Checkmk für die Sektion
<<<openhardwaremonitor>>> benutzt. Statt des toten OpenHardwareMonitor (mit dem als
verwundbar gemeldeten WinRing0-Treiber, CVE-2020-14979) verwendet er die aktuelle
LibreHardwareMonitorLib, standardmäßig direkt aus dem aktuellen Quellcode des
LibreHardwareMonitor-Repos gebaut,
mit dem signierten PawnIO-Treiber.
Er ist ein Drop-in-Ersatz: gleiche Dateinamen, gleicher WMI-Namespace, gleiche Klassen und Eigenschaften. Am Checkmk-Agenten, am Bakery-Plugin und an den Check-Plugins muss nichts geändert werden.
| Original (OHM) | Diese Version | |
|---|---|---|
| Dateien | OpenHardwareMonitorCLI.exe + OpenHardwareMonitorLib.dll |
dieselben zwei Dateien |
| WMI | root\OpenHardwareMonitor, Klassen Sensor und Hardware |
identisch |
| Sensor-Eigenschaften | Index, Name, Parent, SensorType, Value, Min, Max, Identifier | identisch |
| Update-Intervall | 1 s | 1 s (einstellbar) |
| Hardware | CPU, RAM, Mainboard, Lüftersteuerung, HDD | dieselben, optional GPU, PSU, Netzwerk, Akku |
| Treiber | WinRing0 (verwundbar) | PawnIO (signiert, wird separat installiert) |
Der Checkmk-Bakery verteilt genau zwei Dateien. LibreHardwareMonitor braucht aber mehrere DLLs (HidSharp, DiskInfoToolkit, RAMSPDToolkit, System.Memory, …). Deshalb:
OpenHardwareMonitorLib.dllist die unveränderteLibreHardwareMonitorLib.dll, nur umbenannt.OpenHardwareMonitorCLI.exeenthält alle übrigen Abhängigkeiten als eingebettete Ressourcen und lädt sie beim Start selbst.
Das Verhalten entspricht 1:1 dem Original (aus der Original-EXE dekompiliert): Sensoren jede
Sekunde lesen und als WMI-Instanzen veröffentlichen; der Agent fragt
SELECT Index,Name,Parent,SensorType,Value FROM Sensor in Root\OpenHardwareMonitor ab.
Zusätzlich gegenüber dem Original:
-
OHM-kompatible Kennungen (Standard), damit bestehende Checkmk-Services ihre Namen behalten:
LibreHardwareMonitor wird veröffentlicht als /nvme/1,/ata/0,/scsi/2,/ssd/0…/hdd/1,/hdd/0,/hdd/2,/hdd/0/motherboard/mainboard/lpc/nct6798d/0/lpc/nct6798d/gpu-nvidia/0,/gpu-amd/0/nvidiagpu/0,/atigpu/0/intelcpu/0,/amdcpu/0,/ramunverändert Mit
CompatIdentifiers=falsebzw.--native-idswerden die LHM-Kennungen unverändert veröffentlicht. -
Kommas und Zeilenumbrüche in Sensornamen und Geräte-Kennungen werden ersetzt (der Agent trennt mit
,, der Checkmk-Parser verwirft Zeilen mit falscher Spaltenzahl). -
Ungültige Messwerte (NaN/Unendlich) werden als 0 veröffentlicht. Der Agent würde NaN als
-nan(ind)ausgeben, daran scheitert der Checkmk-Parser, und die ganze Sektion fiele aus (alle Services UNKNOWN). -
Übersetzte Sprachdateien der Abhängigkeiten (z. B. deutsche SMART-Attributnamen von DiskInfoToolkit) werden bewusst nicht mitgeliefert: Sensornamen sind auf jedem Host englisch, unabhängig von der Windows-Sprache.
-
Datenmengen (
Data, z. B. RAM-Belegung, gelesene/geschriebene Daten) werden in GB veröffentlicht wie bei OHM. Seit Ende September 2026 liefert LibreHardwareMonitor diese Werte in Bytes; die CLI erkennt das und rechnet um. -
Laufwerks-Sensor
LifeheißtRemaining Life(den Namen erwartet der Checkmk-Checkopenhardwaremonitor_smart). -
Feste Grenz- und Konfigurationswerte, die LibreHardwareMonitor als Temperatursensoren meldet, werden nicht veröffentlicht, sonst entstünden dauerhaft kritische Temperatur-Services: NVMe
Warning Temperature,Critical Temperature,Available Spare Threshold; RAM-ModuleTemperature Sensor Resolution,Thermal Sensor (Critical) Low/High Limit. -
Lüfter erscheinen erst, wenn sie einmal gedreht haben (wie bei OHM). Unbelegte Lüfteranschlüsse tauchen so nicht als Services mit 0 U/min auf.
-
Die 24-Stunden-Werte-Historie von LHM ist abgeschaltet → konstanter Speicherverbrauch.
-
Updates laufen nie parallel (langsame SMART-/GPU-Abfragen stauen sich nicht).
-
Sauberes Beenden (Treiber-Handles werden geschlossen), nur eine Instanz gleichzeitig.
-
Testmodi
--dumpund--report, optionales Logfile.
- .NET Framework 4.7.2 oder neuer (ab Windows 10 1803 / Server 2019 vorhanden; Server 2016 braucht ein Update).
- PawnIO-Treiber – ohne ihn fehlen CPU-Temperaturen, Mainboard/SuperIO (Lüfter, Spannungen) und RAM-Sensoren.
Laufwerke (SMART/NVMe), CPU-Last und RAM-Auslastung gehen auch ohne.
oder Installer von https://pawnio.eu.
winget install namazso.PawnIO
Ohne selbst zu bauen:
- Releases:
OpenHardwareMonitorCLI-LHM-<version>.zipmit EXE, DLL, Beispiel-Config,BUILD-INFO.txtund Installationsskript. - Actions: Jeder Build (bei jedem Push und jeden Montag gegen den aktuellen
LibreHardwareMonitor-Stand) stellt das Artefakt
OpenHardwareMonitorCLI-LHMbereit (GitHub-Login nötig).
Voraussetzung: .NET 10 SDK (winget install Microsoft.DotNet.SDK.10), empfohlen zusätzlich git
(winget install Git.Git). Ohne git lädt das Skript den Quellcode als ZIP von GitHub.
Repo klonen (git clone https://github.com/Tinnitus97/libre_hardware_monitor_checkmk.git) oder als ZIP herunterladen.
Bei einer heruntergeladenen ZIP einmal die Download-Sperre von allen Skripten entfernen (sonst fragt PowerShell bei jedem Skript nach):
Get-ChildItem -Recurse | Unblock-Filebuild.cmd LibreHardwareMonitor aus dem aktuellen Repo-Stand (master)
build.cmd -Ref v0.9.6 bestimmter Branch, Tag oder Commit
build.cmd -NoUpdate vorhandenen Quellcode erneut bauen, ohne zu aktualisieren
build.cmd -FromNuGet letzte stabile Version von nuget.org statt Quellcode
Das Skript holt LibreHardwareMonitor nach external\LibreHardwareMonitor, aktualisiert es bei jedem Lauf
und kompiliert die Bibliothek zusammen mit der CLI. Ergebnis in dist\:
OpenHardwareMonitorCLI.exe
OpenHardwareMonitorLib.dll
OpenHardwareMonitorCLI.exe.config.example
BUILD-INFO.txt welcher LibreHardwareMonitor-Commit verbaut wurde
Der Repo-Stand ist eine Entwicklungsversion und nicht als Release getestet. Wenn ein neuer Stand
Probleme macht, kannst du mit -Ref <commit> auf einen funktionierenden Commit zurückgehen (steht in BUILD-INFO.txt).
Über GitHub Actions (ohne lokales SDK): Der Workflow .github/workflows/build.yml baut auf windows-latest
gegen den aktuellen LibreHardwareMonitor-master, testet --dump und die echte WMI-Abfrage und stellt das Ergebnis
als Artefakt OpenHardwareMonitorCLI-LHM bereit. Er läuft bei jedem Push und zusätzlich jeden Montag; über
„Run workflow“ lässt sich ein bestimmter LibreHardwareMonitor-Ref bauen (auch in einem Fork).
Release erstellen: Entweder ein Tag v* pushen (z. B. git tag v1.1.0 && git push origin v1.1.0) oder auf
GitHub unter Releases → Draft a new release ein neues Tag v… anlegen und veröffentlichen. Der Workflow baut,
testet und hängt die ZIP an das Release an.
Wie in doc/treasures/windows/ohm/README.md von Checkmk beschrieben, nur mit diesen Dateien:
su - meinsite
cp OpenHardwareMonitorCLI.exe OpenHardwareMonitorLib.dll local/share/check_mk/agents/windows/Dann Regel „OpenHardwareMonitor (Windows)“ → Deploy OpenHardwareMonitor (headless), Agenten backen und verteilen. PawnIO muss separat auf den Hosts installiert werden (z. B. per Softwareverteilung/winget).
Hinweis: Der Bakery verteilt keine .config-Datei. Ohne sie gelten die Standardwerte
(CPU, RAM, Mainboard, Lüftersteuerung, Laufwerke; OHM-kompatible Kennungen).
Als Administrator im Repo- bzw. Release-Ordner:
powershell -ExecutionPolicy Bypass -File .\tools\install-checkmk.ps1 -RemoveWinRing0Das Skript stoppt den Agenten, entfernt optional den alten WinRing0-Treiber und das alte WMI-Schema,
kopiert die Dateien nach C:\ProgramData\checkmk\agent\bin, startet den Agenten und zeigt die
gefundenen Sensoren an.
Manuell geht es genauso: beide Dateien nach C:\ProgramData\checkmk\agent\bin kopieren und den
Dienst CheckMkService neu starten. Die Sektion openhardwaremonitor ist im Agenten standardmäßig aktiv.
Danach in Checkmk eine Service-Erkennung für die Hosts ausführen.
# Sensoren direkt im Checkmk-Format ausgeben (ohne WMI, als Administrator):
OpenHardwareMonitorCLI.exe --dump --header
# Alles, was LHM findet (inkl. GPU usw.):
OpenHardwareMonitorCLI.exe --dump --all
# Versionen und PawnIO-Status:
OpenHardwareMonitorCLI.exe --version
# Was der Agent sieht (während der Agent / die CLI läuft):
Get-CimInstance -Namespace root/OpenHardwareMonitor -ClassName Sensor |
Select Index,Name,Parent,SensorType,Value | Sort Parent,SensorType | Format-Table
# Agent-Ausgabe prüfen:
& "C:\Program Files (x86)\checkmk\service\check_mk_agent.exe" test |
Select-String -Context 0,15 "<<<openhardwaremonitor"OpenHardwareMonitorCLI.exe.config.example in OpenHardwareMonitorCLI.exe.config umbenennen und neben die EXE legen:
| Schlüssel | Bedeutung | Standard |
|---|---|---|
Enable |
zusätzliche Gruppen: gpu, network, psu, battery, powermonitor, all |
– |
Disable |
Gruppen abschalten: cpu, memory, motherboard, controller, storage |
– |
IntervalMs |
Update-Intervall in ms (min. 250) | 1000 |
CompatIdentifiers |
OHM-kompatible Kennungen | true |
LogFile |
Logdatei (relativ zur EXE), z. B. OpenHardwareMonitorCLI.log |
– |
Verbose |
ausführliches Log | false |
Dieselben Einstellungen gibt es als Kommandozeilenoptionen (--help).
Gegen den aktuellen Stand von https://github.com/Checkmk/checkmk geprüft:
- Windows-Agent (
agents/wnx): startetbin\OpenHardwareMonitorCLI.exeohne Argumente, wenn der Agent mit Adminrechten läuft und die Sektionopenhardwaremonitoraktiv ist. AbfrageSELECT Index,Name,Parent,SensorType,Value FROM SensorinRoot\OpenHardwareMonitor, Werte perstd::to_wstring, SpalteWMIStatuswird angehängt. Nach zu vielen Fehlern beendet der Agent die CLI, löscht den WMI-Namespace und startet neu; die CLI registriert ihr Schema dabei automatisch wieder. - Bakery (
win_openhardwaremonitor): verteilt genauOpenHardwareMonitorCLI.exeundOpenHardwareMonitorLib.dll. - Check-Plugins (
cmk/plugins/openhardwaremonitor): Parser, Service-Erkennung und alle fünf Checks (Clock, Temperature, Fan, Power, SMART) wurden mit dem originalen Checkmk-Code gegen echte Sensordaten eines Ryzen-Systems ausgeführt; die Checkmk-eigenen Unit-Tests laufen ebenfalls.
Die Checkmk-Temperaturprüfung hat feste Standardgrenzen je Gerätetyp: CPU 60/70 °C, Laufwerke 40/50 °C, alles andere 70/80 °C (Warnung/Kritisch). Moderne Ryzen-CPUs (Tctl) erreichen unter Last regelmäßig 80–95 °C, NVMe-SSDs laufen oft mit 50–70 °C. Diese Services daher über die Regel „Temperature“ passend einstellen.
- Service-Namen bleiben dank der Kompatibilitäts-Kennungen in der Regel gleich. Sensoren, die LHM anders benennt oder neu liefert, tauchen bei der Service-Erkennung als neue/verschwundene Services auf.
- Das alte WMI-Schema sollte einmal gelöscht werden (macht das Installationsskript; der Agent tut es
auch selbst nach mehreren Fehlern):
Get-CimInstance -Namespace root -ClassName __Namespace -Filter "Name='OpenHardwareMonitor'" | Remove-CimInstance - Den alten WinRing0-Treiberdienst (
winring0_1_2_0) entfernen – genau wegen ihm wurde OHM aus Checkmk entfernt.
build.cmd / build.ps1 Build inkl. Download/Update des LibreHardwareMonitor-Quellcodes
src/OpenHardwareMonitorCLI.csproj SDK-Projekt (net472), LHM als Projektreferenz (oder NuGet)
src/Program.cs Einstiegspunkt, Modi (Provider, --dump, --report)
src/DataProvider.cs LHM Computer + Update-Timer
src/WMI/WmiProvider.cs WMI-Veröffentlichung (wie Original)
src/WMI/WmiObjects.cs WMI-Klassen Hardware / Sensor
src/IdentifierMapper.cs LHM → OHM Kennungen
src/EmbeddedAssemblyResolver.cs lädt eingebettete Abhängigkeiten + OpenHardwareMonitorLib.dll
src/Options.cs, App.config Einstellungen
tools/install-checkmk.ps1 Installation in einen lokalen Checkmk-Agenten
.github/workflows/build.yml CI-Build inkl. WMI-Test
You are explicitly welcome to use this code – completely or in parts – to bring LibreHardwareMonitor support back into the Checkmk Windows agent as an official component. That is the goal of this project. Feedback, questions or a short mention are appreciated but not required.
- This repository is licensed under the Mozilla Public License 2.0, like LibreHardwareMonitor and the original Open Hardware Monitor. MPL-2.0 is compatible with the GPLv2 of the Checkmk agent (MPL-2.0 section 3.3, "Secondary Licenses") and allows use in commercial products; only the source of MPL-licensed files has to remain available.
- In addition, the author of this repository grants Checkmk GmbH the permission to use, modify and distribute the code written for this repository under the GNU General Public License v2 or under any other license that Checkmk GmbH uses for its products, without further conditions.
- LibreHardwareMonitor itself and its dependencies (HidSharp, DiskInfoToolkit, RAMSPDToolkit, …) keep their own licenses; the additional permission above covers only the code of this repository.
- No changes are needed in the Windows agent (section
openhardwaremonitor, process start frombin\, WMI querySELECT Index,Name,Parent,SensorType,Value FROM Sensor), in the bakery pluginwin_openhardwaremonitor(same two files) or in the check plugins. - All OHM compatibility adjustments are in one place:
src/IdentifierMapper.cs(identifier mapping, GB conversion forData,Remaining Life, filtering of constant limit values, fans only after the first rotation, separator and NaN sanitizing). - Reproducible builds:
build.ps1 -Ref <commit>pins a LibreHardwareMonitor commit;build.ps1 -FromNuGetuses the NuGet release. The workflow shows the build and smoke test onwindows-latest, including the exact WMI query of the agent. - Runtime requirements: Windows x64, .NET Framework 4.7.2, and the signed
PawnIO driver (installed separately, e.g.
winget install namazso.PawnIO) for CPU, mainboard and DIMM sensors. It could be offered as an optional dependency of the agent package. - Findings in the current check plugins while testing (
cmk/plugins/openhardwaremonitor):- The parser calls
float(value)without error handling. The agent formats NaN as-nan(ind)(std::to_wstring), so a single invalid value from any provider makes the whole section fail. This CLI avoids it, but the parser could also skip such lines. - The default temperature levels (
cpu60/70 °C,hdd40/50 °C) are low for current hardware (AMD Tctl, NVMe SSDs) and lead to CRIT states after the first discovery.
- The parser calls
Mozilla Public License 2.0 – wie LibreHardwareMonitor und OpenHardwareMonitor. Zusätzlich darf die Checkmk GmbH den Code dieses Repositorys unter der GPLv2 oder jeder anderen für ihre Produkte verwendeten Lizenz nutzen (siehe For the Checkmk team).