Prüfen ob ein Windows Programm unter einem bestimmten Benutzer gestartet ist

CMK version: 2.4.0p16
OS version:

Error message:

Output of “cmk --debug -vvn hostname”: (If it is a problem with checks or plugins)

Ich muss prüfen, ob auf einem Windows Server eine Anwendung unter einem bestimmten Benutzer läuft.
Wir haben eine SPS Steuerung einer Fertigungsanlage, die sich leider nicht als Service einrichten lässt, weil sie ein grafisches GUI hat. Die Anwendung muss auf dem Server jeweils gestartet sein. Wie kann ich das mit CheckMK überwachen?

ja das kenne ich gut :wink:

Da die Anwendung auf dem Windows-Server selbst läuft, ist ein lokaler Check (PowerShell-Skript) die eleganteste und performanteste Variante.

1. PowerShell-Skript (empfohlen)

Speichere dieses Skript auf dem Windows-Server unter:

C:\ProgramData\checkmk\agent\plugins\sps_steuerung.ps1

PowerShell

# =============================================================================
# Checkmk Local Check: SPS-Steuerung User Validation
# =============================================================================

$ProcessName  = "SPS_Steuerung"   # Ohne .exe (Get-Process erwartet den Basisnamen)
$RequiredUser = "SPS_SERVICE"    # Der Ziel-User

# Versuche Prozesse zu finden
try {
    $processes = Get-Process -Name $ProcessName -IncludeUserName -ErrorAction SilentlyContinue | 
                 Where-Object { $_.UserName -match $RequiredUser }
    
    if ($processes) {
        $count = $processes.Count
        $userList = ($processes.UserName | Select-Object -Unique) -join ", "
        Write-Output "0 `"SPS_Steuerung`" - OK: $count Instanz(en) läuft unter $userList"
    } else {
        # Prüfen, ob der Prozess unter ANDEREM User läuft oder gar nicht
        $anyProcess = Get-Process -Name $ProcessName -ErrorAction SilentlyContinue
        if ($anyProcess) {
            Write-Output "2 `"SPS_Steuerung`" - CRITICAL: Prozess läuft, aber UNTER FALSCHEM USER"
        } else {
            Write-Output "2 `"SPS_Steuerung`" - CRITICAL: Prozess '$ProcessName' läuft gar nicht"
        }
    }
} catch {
    Write-Output "3 `"SPS_Steuerung`" - UNKNOWN: Fehler beim Auslesen der Prozessdaten (Rechte?)"
}

hat nur einen Haken:

Der Checkmk-Agent läuft standardmäßig als LocalSystem. Wenn du den Parameter -IncludeUserName in PowerShell verwendest, benötigt das Skript Administrator-Rechte.

  • Problem: Der Standard-Agent führt Skripte im User-Kontext aus, was dazu führen kann, dass $_.UserName leer bleibt.
  • Lösung: In der Checkmk-Konfiguration (oder lokal in der check_mk.user.yml) muss sichergestellt sein, dass das Plugin mit den nötigen Rechten läuft.

Gruß Bernd

1 Like

Enforced Services → State and Count of Processes

Mit einem enforced Service Check kannst Du vorschreiben, dass bestimmte Dinge auf dem überwachten Host vorhanden sein sollen. Der Prozess-Check kann dann auch den Account prüfen, unter dem der Prozess läuft.

Für Windows-Prozesse möchtest Du in der Agentenkonfiguration die Nutzung von WMI und den vollen Pfad einstellen:


ps:
    enabled: yes
    use_wmi: yes
    full_path: yes

(oder per Bakery: Finetune Windows process monitoring)

3 Likes

Danke Robert

Habe etwas mit dem Check gekämpft, es aber damit hingekriegt. Das PowerShell von Bernd ist auch eine gute Lösung.

Vielen Dank nach Berlin

2 Likes