- ProcessMonitorService
- Log-Analyse mit PowerShell
- Beispiel: Remote Mass Deployment (nicht optimiert)
- Lizenz
Ein Windows-Dienst und CLI-Tool zur Überwachung von Prozessen über WMI (CIM) Events. Der Dienst protokolliert gestartete und beendete Prozesse in JSON-Dateien, inklusive Benutzer-SID, Pfad und Kommandozeile.
- Überwachung von Prozessen über
__InstanceCreationEventund__InstanceDeletionEvent. - Flexible Filterung nach Prozessname mit Include- und Exclude-Filtern. Konfigurierbar über
appsettings.json. Änderungen an dieser Datei werden automatisch erkannt und übernommen. - Unterstützung für Wildcards (
*und?) in Filtern. - Tägliche JSON-Log-Dateien, standardmäßig gespeichert unter:
C:\ProgramData\ProcessMonitorService\logs\service-<yyyyMMdd>.json - Automatische Erkennung, ob als Windows-Dienst oder interaktiv (CLI) gestartet.
- Protokollierte Informationen:
- Prozessname
- Prozess-ID
- Pfad zur ausführbaren Datei
- Kommandozeile
- Benutzer-SID
- Eventtyp (Start/Stop)
- Zeitstempel
- Prozessname des aufrufenden Prozesses (ParentName)
- Prozess-ID des aufrufenden Prozesses (ParentProcessId)
{
"@t": "2025-06-18T08:49:26.0121288Z",
"@mt": "Process {EventType}: {ProcessName} (PID: {ProcessId}) User: {UserSid} Parent: {ParentName} (PID: {ParentProcessId}) Path: {ExecutablePath} Command: {CommandLine}",
"EventType": "Start",
"ProcessName": "firefox.exe",
"ProcessId": 1234,
"UserSid": "S-1-5-21-1234567890-123456789-1234567890-1001",
"ParentName": "firefox.exe",
"ParentProcessId": 5678,
"ExecutablePath": "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
"CommandLine": "\"C:\\Program Files\\Mozilla Firefox\\firefox.exe\"",
"SourceContext": "ProcessMonitorWorker",
"MachineName": "MYPCNAME",
"ThreadId": 1
}{
"ProcessMonitor": {
"ProcessFilters": [ "notepad.exe", "calc.exe", "chrome*", "my-p?ocess.exe" ],
"ProcessExcludeFilters": ["system*", "svchost.exe", "*temp*"],
"CacheExpiryMinutes": 30,
"StatusUpdateIntervalMinutes": 5,
"CacheCleanupIntervalMinutes": 10
}
}"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"ProcessMonitorWorker": "Information" // <-- Ändere das zu Debug, wenn du mehr Output sehen möchtest
}
}Konfigurationsoptionen:
ProcessFilters: Liste der zu überwachenden Prozesse (Include-Filter). Unterstützt Wildcards (*und?). Wenn leer oder nicht definiert, werden alle Prozesse überwacht.ProcessExcludeFilters: Liste der auszuschließenden Prozesse (Exclude-Filter). Unterstützt Wildcards (*und?). Diese Filter haben Vorrang vor Include-Filtern.CacheExpiryMinutes: Prozesse, die länger laufen als die angegebenen Minuten, werden beim Cache-Aufräumvorgang entfernt. (Standard: 30)StatusUpdateIntervalMinutes: Intervall für Statusmeldungen in Minuten. (Standard: 5)CacheCleanupIntervalMinutes: Intervall für Cache-Aufräumvorgänge in Minuten. (Standard: 10)
Die Filterlogik arbeitet nach folgendem Prinzip:
-
Exclude-Filter (höchste Priorität): Prozesse, die einem Exclude-Filter entsprechen, werden niemals überwacht, unabhängig von Include-Filtern.
-
Include-Filter:
- Wenn Include-Filter definiert sind: Nur Prozesse, die einem Include-Filter entsprechen, werden überwacht.
- Wenn keine Include-Filter definiert sind: Alle Prozesse werden überwacht (außer ausgeschlossene).
-
Wildcard-Unterstützung:
*= beliebig viele Zeichen (z.B.chrome*für alle Chrome-Prozesse)?= genau ein Zeichen (z.B.my-p?ocess.exefürmy-process.exe)
Beispiele:
{
"ProcessFilters": ["notepad.exe", "chrome*"],
"ProcessExcludeFilters": ["*temp*", "system*"]
}- ✅ Überwacht:
notepad.exe,chrome.exe,chrome_proxy.exe - ❌ Nicht überwacht:
notepad_temp.exe,system32.exe,calc.exe(nicht in Include-Liste)
{
"ProcessFilters": [],
"ProcessExcludeFilters": ["svchost.exe", "*temp*"]
}- ✅ Überwacht: Alle Prozesse außer den ausgeschlossenen
- ❌ Nicht überwacht:
svchost.exe,notepad_temp.exe,temp_file.exe
- .NET 9
- Administratorrechte für:
- Dienstinstallation
- Zugriff auf Prozessinformationen
- Schreiben nach
C:\ProgramData\ProcessMonitorService
Voraussetzungen
- .NET 9 SDK mit
winget install Microsoft.DotNet.SDK.9 - Pakete:
dotnet add package Microsoft.Extensions.Hosting --version 9.0.6 dotnet add package Microsoft.Extensions.Hosting.WindowsServices dotnet add package Microsoft.Extensions.Diagnostics.HealthChecks dotnet add package Microsoft.Management.Infrastructure dotnet add package System.Management dotnet add package Serilog.Extensions.Hosting dotnet add package Serilog.Settings.Configuration dotnet add package Serilog.Sinks.Console dotnet add package Serilog.Sinks.File dotnet add package Serilog.Formatting.Compact
Debug Build:
dotnet buildPublish Build:
Wird erstellt in \bin\Release\net9.0-windows\win-x64\publish\ProcessMonitorService.exe
dotnet publish -c Release -r win-x64 --self-contained true- Verwendet:
\bin\Release\net9.0-windows\win-x64\publish\ProcessMonitorService.exe - Dienst startet automatisch nach Ausführung der
install.ps1
.\install.ps1Start-Service ProcessMonitorService.\uninstall.ps1Das Programm kann auch direkt in einer Eingabeaufforderung (mit Administratorrechten) gestartet werden. Es überwacht dann Prozesse interaktiv und gibt die Logs in die Konsole und in die Log-Datei aus.
.\ProcessMonitorService.exe- Zum Beenden
Strg+Cverwenden.
-
Für beendete Prozesse kann die Benutzer-SID nicht direkt mehr ausgelesen werden – sie wird daher zur Startzeit gespeichert und beim Stop-Ereignis wiederverwendet.
-
Verwendet
System.Management(WMI/CIM), daher nur unter Windows lauffähig. -
Zugriff auf die Daten wird auf
Administratoren(undSystem) beschränkt (Alternativ:./Set-SecureACLs.ps1- wird bei Installation ausgeführt):New-Item -Path "C:\ProgramData\ProcessMonitorService" -ItemType Directory -Force icacls "C:\ProgramData\ProcessMonitorService" /inheritance:r icacls "C:\ProgramData\ProcessMonitorService" /grant:r "*S-1-5-32-544:(OI)(CI)(F)" "*S-1-5-18:(OI)(CI)(F)"
Wichtige Well-Known SIDs:
S-1-5-32-544= Administratoren/AdministratorsS-1-5-18= SYSTEMS-1-5-32-545= Benutzer/UsersS-1-5-11= Authentifizierte Benutzer/Authenticated Users
Das mitgelieferte PowerShell-Skript process-JSONFiles.ps1 ermöglicht die komfortable Analyse der JSON-Log-Dateien.
Grundlegende Verwendung:
# Alle Events des aktuellen Tages anzeigen
.\process-JSONFiles.ps1
# Nach spezifischem Prozess filtern
.\process-JSONFiles.ps1 -ProcessName "chrome.exe"
# Nur Start-Events anzeigen
.\process-JSONFiles.ps1 -EventType "Start"
# Events der letzten 7 Tage
.\process-JSONFiles.ps1 -Days 7
# Kombinierte Filter
.\process-JSONFiles.ps1 -ProcessName "notepad.exe" -EventType "Start" -Days 3
# Kombinierte Filter mit GridView-Ausgabe und Pipeline-Weiterverarbeitung
.\process-JSONFiles.ps1 -ProcessName "chrome.exe" -EventType "All" -Days 3 -ForPipeline | Out-GridView -Title "Chrome Prozessereignisse der letzten drei Tage" -PassThru | ForEach-Object {$_}Export-Funktionen:
# Events in CSV-Datei exportieren
.\process-JSONFiles.ps1 -Export
# Gefilterte Events exportieren
.\process-JSONFiles.ps1 -ProcessName "chrome.exe" -Days 7 -Export
# Zeigt nur Start- und Stop-Zeiten von Prozessen an, berechnet die Laufzeit
.\process-JSONFiles.ps1 -OnlyProcessRuntimes| Parameter | Beschreibung | Standard |
|---|---|---|
-LogPath |
Pfad zu den JSON-Log-Dateien | C:\ProgramData\ProcessMonitorService\logs\service-*.json |
-ProcessName |
Filter nach Prozessname (z.B. "chrome.exe") | Alle Prozesse |
-EventType |
Filter nach Event-Typ: "Start", "Stop", "All" | "All" |
-Days |
Zeigt Events der letzten X Tage | 1 |
-Export |
Exportiert Ergebnisse in CSV-Datei | Nein |
-ForPipeline |
Ermöglicht Weiterverarbeitung der Ergebnisse über Pipeline | Nein |
-OnlyProcessRuntimes |
Zeigt nur Start- und Stop-Zeiten von Prozessen an, berechnet die Laufzeit | Nein |
Das Skript zeigt folgende Informationen an:
- Timestamp: Datum und Uhrzeit des Events
- EventType: "Start" oder "Stop"
- ProcessName: Name der ausführbaren Datei
- ProcessId: Prozess-ID
- UserSid: Benutzer-SID
- ExecutablePath: Vollständiger Pfad zur Datei
- CommandLine: Verwendete Kommandozeile
=== ProcessMonitorService Log-Analyse ===
✅ Gefundene Dateien: 3
📈 Gesamte Process-Events: 142
🔍 Nach Prozessname 'chrome.exe' gefiltert: 28
📋 Gefilterte Events:
Timestamp EventType ProcessName ProcessId UserSid
--------- --------- ----------- --------- -------
2025-06-15 09:15:32 Start chrome.exe 1234 S-1-5-21-123456789-123456789-123456789-1001
2025-06-15 09:15:45 Stop chrome.exe 1234 S-1-5-21-123456789-123456789-123456789-1001
📊 Statistiken:
Name Count
---- -----
chrome.exe 28
notepad.exe 15
calc.exe 8
$mycredentials = (Get-Credential);
$myhosts = @(
"MYHOSTNAME1",
"MYHOSTNAME2"
)
$myhosts | % {
.\Deploy-ProcessMonitorService.ps1 -TargetHost $_ -Credential $mycredentials
}MIT – freie Nutzung, keine Garantie.