Du möchtest wissen, wann du deinen PC morgens eingeschaltet und wann du ihn wieder heruntergefahren hast? Vielleicht möchtest du sogar deine ungefähren Arbeitszeiten ermitteln – ganz automatisch und ohne zusätzliche Tools? Gute Nachrichten: Das funktioniert mit Windows-Bordmitteln und ein bisschen PowerShell!
đź§ Was steckt dahinter?
Windows protokolliert im System-Eventlog jede Menge Aktivitäten – darunter auch Start- und Schlafzeiten deines Computers. Mit PowerShell kannst du diese Ereignisse gezielt auslesen und daraus deine tägliche Anwesenheit ableiten.
Das Skript unten durchsucht fĂĽr einen beliebigen Zeitraum das Windows-Eventlog und ermittelt fĂĽr jeden Tag:
- Die erste Aktivität
- Die letzte Aktivität
- Die Dauer des Standby-/Sleep-Zustands
- Die Netto-Arbeitszeit
📜 Das PowerShell-Skript:
powershellCopyEdit$startDay = Get-Date -Date '2025/01/01'
$endDay = Get-Date -Date '2025/04/01'
$days = New-Object 'System.Collections.Generic.List[System.DateTime]'
For ($today = $startDay; $today -le $endDay; $today = $today.AddDays(1)) {
$days.Add($today)
}
$days | ForEach-Object {
$day = $_
$events = Get-EventLog -LogName System | Where-Object { $_.TimeGenerated.Date -eq $day.Date }
$maxDate = ($events | Measure-Object -Property TimeGenerated -Maximum).Maximum
$minDate = ($events | Measure-Object -Property TimeGenerated -Minimum).Minimum
$sleepEvents = $events | Where-Object { $_.EventID -eq 42 }
$wakeEvents = $events | Where-Object { $_.EventID -in 1, 107 }
$sleepTime = 0
foreach ($sleep in $sleepEvents) {
$wake = $wakeEvents | Where-Object { $_.TimeGenerated -gt $sleep.TimeGenerated } | Select-Object -First 1
if ($wake) {
$sleepTime += ($wake.TimeGenerated - $sleep.TimeGenerated).TotalSeconds
}
}
$workingHours = if ($minDate -and $maxDate) {
[math]::Max(($maxDate - $minDate).TotalSeconds - $sleepTime, 0)
} else {
$null
}
[PSCustomObject]@{
Day = $day.ToShortDateString()
From = if ($minDate) { $minDate.ToLongTimeString() } else { "N/A" }
To = if ($maxDate) { $maxDate.ToLongTimeString() } else { "N/A" }
'Sleep Time' = "$([math]::Round($sleepTime / 3600, 2)) h"
'Working Hours' = if ($workingHours) { "$([math]::Round($workingHours / 3600, 2)) h" } else { "N/A" }
}
} | Format-Table -AutoSize
⚠️ Wichtige Hinweise:
- Das Skript nutzt die klassischen Event-IDs:
1
und107
fĂĽr das Aufwachen aus dem Standby.42
fĂĽr den Ăśbergang in den Ruhemodus.
- Die Daten sind nur so gut wie die Logs selbst. Wenn dein PC nachts durchläuft oder du dich mit mehreren Geräten abwechselst, kann es zu Ungenauigkeiten kommen.
- Bei sehr langen Zeiträumen kann die Ausführung dauern, da Windows die EventLogs nicht gerade blitzschnell durchwühlt.
📎 Anwendungsfälle in der Praxis
In einer Welt mit Homeoffice und Vertrauensarbeitszeit kann dieses Skript nützlich sein, um ungefähre Arbeitszeiten zu dokumentieren, z. B. für:
- Selbstständige: Zur Unterstützung der Stundenerfassung.
- Mitarbeiter im Homeoffice: Als ergänzende Info zur Zeiterfassung.
- Admins & Analysten: Zur Analyse von PC-Nutzungsmustern.
đź“° Aktuelle Einordnung
Laut einem Artikel im heise-Newsticker (März 2025) plant Microsoft, den Zugriff auf Systemlogs in künftigen Windows-Versionen weiter zu vereinfachen – insbesondere in Windows 11. Das könnte solche Skripte künftig noch effizienter machen, etwa durch moderne Cmdlets oder bessere Filterung.
🔍 Weitere Ressourcen:
- Microsoft Docs – Event ID 42 (Sleep)
- EventID.net – Windows Event Log Datenbank
- heise.de: Eventlog-Tipps fĂĽr IT-Profis
- PowerShell Grundlagen – Script Beispiele (administrator.de)
Fazit: Mit ein paar PowerShell-Zeilen kannst du ganz ohne teure Tools deine tägliche PC-Nutzung analysieren – und dabei fast schon eine kleine Arbeitszeiterfassung aufbauen. Smart, oder?