Motivation
Unserer Zeiterfassungssoftware startet normalerweise beim Hochfahren des Rechners.
Im Homeoffice kann es aber passieren, dass der VPN-Client nicht automatisch startet und die Zeiterfassung nicht funktioniert.
Dann muss man die Arbeitszeit per Hand eintragen. Dazu schaue ich mir im Event Viewer das letzten winlogon-Event an.
Um nicht mehr in der Ereignisanzeige suchen zu müssen, habe ich mir ein kleines Script geschrieben, dass mir das letzten winlogon-Event anzeigt.
Code
Als Erstes installieren wir das Paket pywin32, welches uns den Zugriff auf die Windows-API ermöglicht.
pip install pywin32
Mit der OpenEventLog-Methode können wir das eventlog öffnen:
handle = win32evtlog.OpenEventLog(SERVER, LOGTYPE)
Da wir die Events vom letzten Eintrag aus durchgehen wollen, setzen wir die flags auf EVENTLOG_BACKWARDS_READ.
flags = win32evtlog.EVENTLOG_SEQUENTIAL_READ | win32evtlog.EVENTLOG_BACKWARDS_READ
Mit der ReadEventLog Methode können wir die Events auslesen.
events = win32evtlog.ReadEventLog(handle, flags, 0)
Achtung: Es kommen nicht alle Events, sondern nur Chunks! Deshalb müssen wir iterieren.
Die Information, die wir suchen, steckt im SourceName und heißt “Microsoft-Windows-Winlogon”
Wenn wir ein Event mit dem Namen gefunden haben, können wir den Timestamp aus der TimeGenerated Property auslesen.
for event in events:
if 'Microsoft-Windows-Winlogon' in event.SourceName:
last_logon = event.TimeGenerated
found = True # we're only interested in the last
break
Da uns nur der letzte Eintrag interessiert, brechen wir aus beiden Schleifen raus.
zu guter Letzt schließen wir das Eventlog noch sauber
win32evtlog.CloseEventLog(handle)
Vollständiger Code
import win32evtlog
def get_last_win_logon():
last_logon = None
handle = win32evtlog.OpenEventLog(None, 'System')
flags = win32evtlog.EVENTLOG_SEQUENTIAL_READ | win32evtlog.EVENTLOG_BACKWARDS_READ
found = False
while not found: # we need an outer loop because events will be retrieved as chunks
events = win32evtlog.ReadEventLog(handle, flags, 0)
if not events:
break # no more events
for event in events:
if 'Microsoft-Windows-Winlogon' in event.SourceName:
last_logon = event.TimeGenerated
found = True # we're only interested in the last
break
win32evtlog.CloseEventLog(handle)
return last_logon