killtec
Goto Top

Anzeigen der ersten Anmelde und letzten Abmeldezeit

Hallo zusammen,
ich würde gerne aus meinem System die erste Anmeldezeit und die letzte Abmeldezeit aus dem Eventlog filtern.
Versucht habe ich bisher dies:
<QueryList>
  <Query Id="0" Path="Security">  
    <Select Path="Security">  
      *[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and ( Task =  
12544 or Task = 12545 )]]
       and
      *[EventData[Data[@Name='TargetUsername'] and (Data='meinbenutzer')]]  
    </Select>
  </Query>
</QueryList>

Aber das scheint nicht ganz das zu sein, was ich suche. Ich will also nur die Ereignisse filtern. Wo ein Benutzer sich aktiv (per Keyboard) An oder Abgemeldet hat.

OS: Windows 7 Pro

Gruß

Content-ID: 251777

Url: https://administrator.de/contentid/251777

Ausgedruckt am: 21.11.2024 um 23:11 Uhr

colinardo
Lösung colinardo 13.10.2014 aktualisiert um 19:48:13 Uhr
Goto Top
Hallo killtec,
ich würde gerne aus meinem System die erste Anmeldezeit und die letzte Abmeldezeit aus dem Eventlog filtern.
was meinst du mit erster Anmeldezeit? Die erste Anmeldung des heutigen Tages ?

Beispiel für die erste Anmeldung des Tages und der letzten Abmeldung (Powershell):
$firstLogon = Get-WinEvent -LogName Security -FilterXPath "Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (Task = 12544)] and EventData[Data[@Name='TargetUsername'] = 'BENUTZERNAME' and Data[@Name='LogonType'] and (Data=11 or Data=10 or Data=2)]]" | ?{$_.TimeCreated -ge (get-date).Date} | sort TimeCreated | select -First 1  
$lastLogoff = Get-WinEvent -LogName Security -FilterXPath "Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (Task = 12545)] and EventData[Data[@Name='TargetUsername'] = 'BENUTZERNAME' and Data[@Name='LogonType'] and (Data=11 or Data=10 or Data=2)]]" | ?{$_.TimeCreated -ge (get-date).Date} | sort TimeCreated -Descending | select -First 1  

write-host "Erste Anmeldung:"$firstLogon.TimeCreated  
write-host "Letze Abmeldung:"$lastLogoff.TimeCreated  
write-host "Die Differenz beträgt: "($lastLogoff - $firstLogon).toString("g")  
BENUTZERNAME natürlich ersetzen.

Grüße Uwe
killtec
killtec 14.10.2014 um 08:00:07 Uhr
Goto Top
Hi Uwe,
das funktioniert schon gut face-smile Danke schon mal. Wie kann ich denn einen Zeitraum angeben? Bsp. 06-10.10. Bzw. ein bestimmtes Datum? muss ich hier einfach das
(get-date).Date}
durch das Datum ersetzen? Also
13.10.2014}

Gruß
colinardo
colinardo 14.10.2014 um 08:07:08 Uhr
Goto Top
?{$_.TimeCreated -ge (get-date '06.10.2014') -and  $_.TimeCreated -le (get-date '10.10.2014')}
Grüße Uwe
killtec
killtec 14.10.2014 um 08:30:32 Uhr
Goto Top
Uwe,
ist das korrekt dass die Ausgabe dieses Vefehles leer ist?:
Get-WinEvent -LogName Security -FilterXPath "Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (Task = 12545)] and EventData[Data[@Name='TargetUsername'] = 'Benutzername' and Data[@Name='LogonType'] and (Data=11 or Data=10 or Data=2)]]" | ?{$_.TimeCreated -ge (get-date '06.10.2014')} | sort TimeCreated -Descending | select -First 1  

Gruß
colinardo
colinardo 14.10.2014 aktualisiert um 09:09:15 Uhr
Goto Top
Also ich erkläre das mal genauer.
Get-WinEvent filtert erst mal das komplette Eventlog nach deinen Kriterien. Danach enthält es alle gewünschten Events, jedoch noch aus dem kompletten Zeitraum des Eventlog .d.h soweit dies zurückreicht. Dies muss nun auf einen Datumsbereich eingeschränkt werden. Dazu benötigen wir zwei Zeitangaben, die Anfangszeit und die Endzeit. In deinem geposteten Code sind also alle Events vom 06.10.2014 00:00 Uhr bis jetzt enthalten, weil du die Endzeit nicht einschränkst.
Auch zu erwähnen ist, das der Fall eintreten kann das du dich an einem Tag überhaupt nicht an- oder abgemeldet hast weil z.B. der Rechner über Nacht durchgelaufen ist. Deswegen kann es durchaus sein das eins oder beide Daten leer sein können, je nachdem welchen Zeitraum du filterst. Ebenso kann es sein das sich ein Rechner zwei Tage im Hibernate befindet, dann sind natürlich für diesen Zeitraum ebenfalls keine Daten vorhanden.

Grüße Uwe
killtec
killtec 14.10.2014 um 09:25:19 Uhr
Goto Top
Hi Uwe,
ok, das habe ich soweit verstanden face-smile
Jetzt bekomme ich jedoch folgende Ausgabe:
PS C:\Windows\system32> $firstLogon = Get-WinEvent -LogName Security -FilterXPath "Event[System[Provider[@Name='Microsof  
t-Windows-Security-Auditing'] and (Task = 12544)] and EventData[Data[@Name='TargetUsername'] = 'BENUTZERNAME' and Dat  
a[@Name='LogonType'] and (Data=11 or Data=10 or Data=2)]]" | ?{$_.TimeCreated -ge (get-date '06.10.2014') -and  $_.TimeC  
reated -le (get-date '10.10.2014')} | sort TimeCreated | select -First 1  
PS C:\Windows\system32> $lastLogoff = Get-WinEvent -LogName Security -FilterXPath "Event[System[Provider[@Name='Microsof  
t-Windows-Security-Auditing'] and (Task = 12545)] and EventData[Data[@Name='TargetUsername'] = 'BENUTZERNAME' and Dat  
a[@Name='LogonType'] and (Data=11 or Data=10 or Data=2)]]" | ?{$_.TimeCreated -ge (get-date '06.10.2014') -and  $_.TimeC  
reated -le (get-date '10.10.2014')} | sort TimeCreated -Descending | select -First 1  
PS C:\Windows\system32>
PS C:\Windows\system32> write-host "Erste Anmeldung:"$firstLogon.TimeCreated  
Erste Anmeldung: 06.10.2014 07:45:39
PS C:\Windows\system32> write-host "Letze Abmeldung:"$lastLogoff.TimeCreated  
Letze Abmeldung:
PS C:\Windows\system32> write-host "Die Differenz beträgt: "($lastLogoff - $firstLogon).toString("g")  
Der Vorgang "[$null] - [System.Diagnostics.Eventing.Reader.EventLogRecord]" ist nicht definiert.  
Bei Zeile:1 Zeichen:51
+ write-host "Die Differenz beträgt: "($lastLogoff - <<<<  $firstLogon).toString("g")  
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : NotAdefinedOperationForTypeType

PS C:\Windows\system32>

P.S.: Habe natürlich den Benutzernamen durch meinen ersetzt gehabt.

Die Meldung, dass die Differenz nicht errechnet werden kann liegt vermutlich daran, dass die zweite Variable leer ist.
Da ich den PC abends abschalte, weiß ich. dass dort eigentlich etwas stehen sollte. Hast du hier noch eine Idee?

Danke.

Gruß
colinardo
colinardo 14.10.2014 aktualisiert um 09:31:31 Uhr
Goto Top
Zitat von @killtec:
P.S.: Habe natürlich den Benutzernamen durch meinen ersetzt gehabt.

Die Meldung, dass die Differenz nicht errechnet werden kann liegt vermutlich daran, dass die zweite Variable leer ist.
Da ich den PC abends abschalte, weiß ich. dass dort eigentlich etwas stehen sollte. Hast du hier noch eine Idee?
Das ist ja klar, die Differenz habe ich nur als einfaches Beispiel ohne Fehlerprüfung mit eingefügt, ohne einen Wert kann ja auch nix berechnet werden face-wink
Da musst du dann eine IF-Abfrage davor setzen um zu prüfen ob die Variable einen Wert hat
if ($lastLogoff -ne $null -and $firstLogon -ne $null){
  write-host "Die Differenz beträgt:"($lastLogoff - $firstLogon).toString("g")  
}
killtec
killtec 14.10.2014 um 09:35:29 Uhr
Goto Top
Ok,
die Frage ist jedoch, Warum ist der zweite Wert leer obwohl da was stehen müsste?

Gruß
colinardo
colinardo 14.10.2014 aktualisiert um 09:41:30 Uhr
Goto Top
Zitat von @killtec:
die Frage ist jedoch, Warum ist der zweite Wert leer obwohl da was stehen müsste?
Erstens kenne ich die Einträge in deinem Eventlog nicht, und zweitens ist dein hier geposteter Code in mehrere Zeilen gesplittet in der Konsole eingeben worden, so kann es nicht laufen. Pack das ganze in eine PS1-Datei und führe diese dann aus ...

Check auch mal ob deine Abmelde-Events die aufgeführten LogonType's bei dir besitzen ...
killtec
killtec 14.10.2014 aktualisiert um 09:50:11 Uhr
Goto Top
Da muss ich dir recht geben face-smile
So, wenn ich das ganze in eine PS1-Datei packe, bleibt es leider trotzdem leer.

Habe das mal so in die PS eingegeben:
Get-WinEvent -LogName Security -FilterXPath "Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (Task = 12545)] and EventData[Data[@Name='TargetUsername'] = 'BENUTZERNAME' and Data[@Name='LogonType'] and (Data=11 or Data=10 or Data=2)]]"

Da kommen Daten raus, aber das sieht ein bisschen komisch aus...
TimeCreated
-----------
29.07.2014 10:50:41
29.07.2014 09:33:05
15.07.2014 13:35:49
15.07.2014 13:30:06
15.07.2014 11:22:03
15.07.2014 11:22:02
14.07.2014 11:45:20
14.07.2014 11:45:19
14.07.2014 10:00:08
14.07.2014 09:59:34
14.07.2014 09:59:26
03.07.2014 11:39:50
01.07.2014 11:13:37
26.06.2014 07:39:42
25.06.2014 11:45:50
19.05.2014 10:43:20
19.05.2014 10:31:16
28.04.2014 07:37:18
28.02.2014 12:47:08
26.01.2014 16:25:03
26.01.2014 12:07:20
26.01.2014 11:48:11
26.01.2014 11:39:36
18.12.2013 14:56:20
09.12.2013 07:31:30
02.10.2013 11:04:02
02.10.2013 11:01:56
17.09.2013 16:03:46
17.09.2013 13:38:37
17.09.2013 10:34:55
17.09.2013 10:14:43
17.09.2013 08:15:43
16.09.2013 16:59:42
16.09.2013 16:31:34
16.09.2013 14:19:29
16.09.2013 12:12:11
05.09.2013 15:41:16
05.09.2013 11:38:57

P.S.: Das ist die gesamte Liste...

Gruß
novregen
novregen 10.04.2017 um 14:53:49 Uhr
Goto Top
Hallo, das ganze würde mich auch interessieren. Wenn es ein domain Benutzername ist, müßte die Abfrage dann auf dem DomainController erfolgen ? Habe dort einmal probiert, es werden jedoch keine Ereignisse mit dem Filter gefunden.
colinardo
Lösung colinardo 10.04.2017 um 15:25:03 Uhr
Goto Top
Zitat von @novregen:

Hallo, das ganze würde mich auch interessieren. Wenn es ein domain Benutzername ist, müßte die Abfrage dann auf dem DomainController erfolgen ? Habe dort einmal probiert, es werden jedoch keine Ereignisse mit dem Filter gefunden.
Das ist nur für lokale Anmeldungen gedacht, für Domainanmeldungen siehe:

An- und Abmelde Ereignisse mit Powershell auslesen

Grüße Uwe