derwowusste
Goto Top

Last Logon Datum per Powershell abrufen

Moin Kollegen.

Wer ist vor 10 schon so fit, mir Folgendes zu erklären:
Das zum Titel passende Skript ist schnell gefunden:
    Import-Module ActiveDirectory

    function Get-ADUserLastLogon([string]$userName)
    {
    $dcs = Get-ADDomainController -Filter {Name -like "*"}  
    $time = 0
    foreach($dc in $dcs)
    {
    $hostname = $dc.HostName
    $user = Get-ADUser $userName | Get-ADObject -Properties lastLogon
    if($user.LastLogon -gt $time)
    {
    $time = $user.LastLogon
    }
    }
    $dt = [DateTime]::FromFileTime($time)
    Write-Host $username "last logged on at:" $dt }  

    Get-ADUserLastLogon -UserName testnutzer
Auf meinem PC funktioniert das auch. Auf anderen PCs liefert es jedoch "testnutzer last logged on at: 1/1/1601 1:00:00 AM" und das verstehe ich nicht.

Ich habe schon verstanden, wie das Skript arbeitet und auch, wieso es theoretisch 1601 ausspuckt. Aber warum sollte es dies auf einigen PCs tun und auf anderen korrekt arbeiten?
Selbst wenn ich in Zeile 5 den Filter so ändere, dass immer DC1 genommen wird (auf DC 1 hat sich Testnutzer heute angemeldet), kommt dennoch 1601 raus.

Content-Key: 517518

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

Printed on: April 18, 2024 at 07:04 o'clock

Member: aqui
aqui Nov 21, 2019 at 08:30:24 (UTC)
Goto Top
Ist doch eigentlich eine Steilvorlage für @colinardo den Shell Wizzard ! face-big-smile
Member: sabines
sabines Nov 21, 2019 updated at 08:47:52 (UTC)
Goto Top
Moin,

ich erinnere mich dunkel daran, dass LastLogon nicht immer korrekte Werte liefert.
Ich suche das mal raus.

Edit habs gefunden:
https://blogs.technet.microsoft.com/askds/2009/04/15/the-lastlogontimest ...
Die Info könnte aber veraltet sein.

Gruss
Member: DerWoWusste
DerWoWusste Nov 21, 2019 at 08:49:30 (UTC)
Goto Top
Es ist schon gruselig...
Ich demonstriere das gerade einem Kollegen - und plötzlich geht es. Nicht nur bei ihm, sondern auch bei anderen.

Warum sollte der DC1 seine Infos erst nach mehrmaligem Bitten ausspucken? Über die GUI (ADUC/dsa.msc) gibt dieser DC doch auch stets den korrekten Wert aus.
Member: Kraemer
Kraemer Nov 21, 2019 updated at 08:53:10 (UTC)
Goto Top
ungetestet - auf dem Handy zusammen getickert

Import-Module ActiveDirectory

function Get-ADUserLastLogon([string]$userName) {
    $dcs = Get-ADDomainController -Filter { Name -like "*" }  
    $time = Get-Date(0)
    foreach ($dc in $dcs) {
        $hostname = $dc.HostName
        $user = Get-ADUser -Filter {Name -eq $username} -server $hostname -Properties LastLogonDate
        if ($user.LastLogonDate -gt $time) {
            $time = $user.LastLogon
        }
    }
    Write-Host $username "last logged on at:" $Time.Date  
}

Get-ADUserLastLogon -UserName testnutzer

Edit: CP-Fehler
Member: Bitboy
Bitboy Nov 21, 2019 at 08:55:07 (UTC)
Goto Top
Ist zwar schon kurz vor 10 aber gefühlt noch halb 8.

https://social.technet.microsoft.com/Forums/office/de-DE/1ae08081-dcfe-4 ...

Der Kollege meint, dass lastlogon nicht repliziert wird.
Ich rate mal ins blaue und sage, dass der PC auf dem du das Script aufrufst nur den DC fragt, bei dem er selber angemeldet ist unabhängig davon welchen welchen DC du im Skript definierst.

Kannst ja mal die Theorie prüfen wenn du schaust ob alle PCs auf denen es funktioniert am selben DC angemeldet sind.
Member: emeriks
emeriks Nov 21, 2019 updated at 09:22:38 (UTC)
Goto Top
Der Ansatz von @Kraemer ist der richtige!

LastLogon wird nicht repliziert. Man muss jeden DC der betreffenden Domäne abfragen und das jüngste Datum gilt dann. Immer nur jener DC, über welchen die letzte Anmeldung erfolgt ist, hat den aktuellen Zeitstempel.

Hinweis:
Das ist nicht das letzte interaktive Logon! Es ist der Zeitstempel, wann der Benutzer zuletzt seine Anmeldedaten bestätigt hat.
Bsp:
  1. 8:00 Uhr interaktive Anmeldung am PC --> DC1 speichert Zeitstempel 8:00
  2. 8:10 Uhr erster Zugriff auf Freigabe auf Fileserver FS1 --> FS1 erstellt neue Sitzung für diesen Benutzer, fragt dafür bei DC2 nach --> DC2 speichert Zeitstempel 8:10
  3. 8:20 Uhr erster Zugriff auf Drucker auf Printserver PS1 --> PS1 erstellt neue Sitzung für diesen Benutzer, fragt dafür bei DC3 nach --> DC3 speichert Zeitstempel 8:20

E.

siehe auch hier https://activedirectoryfaq.com/2014/02/msds-lastsuccessfulinteractivelog ...
und die dort genannten Links
Member: DerWoWusste
DerWoWusste Nov 21, 2019 at 09:28:07 (UTC)
Goto Top
Moin.

LastLogon wird nicht repliziert
Das ist mir klar. Das Skript, was ich nehme fragt doch alle DCs und nimmt den neuesten Eintrag, oder nicht?
Mitglied: 141965
Solution 141965 Nov 21, 2019 updated at 09:35:52 (UTC)
Goto Top
Zitat von @DerWoWusste:

Moin.

LastLogon wird nicht repliziert
Das ist mir klar. Das Skript, was ich nehme fragt doch alle DCs und nimmt den neuesten Eintrag, oder nicht?
Nein, deine Schleife über alle DCs wird bei deinem Skript gar nicht genutzt, $hostname kommt bei keiner Abfrage zum Einsatz 😉.
Member: emeriks
Solution emeriks Nov 21, 2019 at 09:35:46 (UTC)
Goto Top
Zitat von @DerWoWusste:
Das ist mir klar. Das Skript, was ich nehme fragt doch alle DCs und nimmt den neuesten Eintrag, oder nicht?
Nein. Du verwendest $hostname nicht.

So:
$user = Get-ADUser $userName | Get-ADObject -Properties lastLogon -Server $hostname
Member: DerWoWusste
DerWoWusste Nov 21, 2019 at 09:47:03 (UTC)
Goto Top
Top, Emeriks... ich muss blind sein.
Der Code kam übrigens von MS: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/window ...
Member: Kraemer
Kraemer Nov 21, 2019 at 10:17:19 (UTC)
Goto Top
Zitat von @DerWoWusste:

Top, Emeriks... ich muss blind sein.
sogar doppelt - ich hatte deinen Code entsprechend angepasst
Member: DerWoWusste
DerWoWusste Nov 21, 2019 at 10:31:02 (UTC)
Goto Top
Sorry, Kraemer, das hatte ich schon gesehen, nur zunächst zurückgestellt, da diese Syntax bei mir keinen Output generiert.