🕒 Arbeitszeiten aus Windows-Logs ermitteln – ganz ohne Stempeluhr!

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 und 107 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:


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?

Nach oben scrollen