What's the difference between LastLogon and LastLogonTimestamp

Hallo zusammen,

Was ist der Unterschied zwischen den AD Attributen "lastLogon" und "LastLogonTimestamp". Ich finde das ist im folgenden Artikel gut erklärt und deshalb zitiere ich daraus.

lastLogonTimeStamp vs lastLogon

https://www.der-windows-papst.de/2018/04/13/lastlogontimestamp-vs-lastlogon/

 

lastLogon

Dieses Attribut wird nur auf dem Domänencontroller aktualisiert gegen den sich der Benutzer authentifiziert hat. Das Attribut wird nicht mit anderen DCs repliziert oder im GC gespeichert. Bei Computern wird der Wert nur aktualisiert, wenn sich ein Computer gegen die Domäne authentifiziert, z.B. nach einem Bootvorgang oder bei nach der Aktualisierung des Zugriffstokens.

 

lastLogonTimeStamp

Dieses Attribut wird zwischen allen Domänencontrollern in der Gesamtstruktur repliziert aber nicht im GC gespeichert. Verantwortlich für die Synchronisierung dieser Angabe ist Wert msDS-LogonTimeSyncInterval.

 

Die Standardmäßige Replikation beginnt erst nach 14 Tagen, wobei ein Zufallswert von minus 0-5 Tagen den tatsächlichen Zeitpunkt der Replikation bestimmt. Daraus ergibt sich ein Replikationsfenster zwischen 9-14 Tagen.

 

Dieses Konstrukt soll die Netzwerkbandbreite vor unzähligen und unnötigen Replikationen schützen (optimieren).

 

Hat sich ein Benutzer egal auf welche Weise noch nie an die Domäne angemeldet so bleibt der Wert des Attributes = NULL (nie/never).

 

Hat sicher der Benutzer das erste Mal angemeldet, so wird der Wert des Attributes lastLogon sofort an lastLogonTimeStamp übergeben und an alle anderen DCs repliziert. Eine darauffolgende Anmeldung aktualisiert dann nur noch das Attribut lastLogon. Das ist auf dem rechten Bild sehr gut zu erkennen.

 

Ab jetzt bleibt der Wert des Attributes lastLogonTimeStamp nach dem obigen Prinzip stehen und wird nach spätestens 14 Tagen repliziert.

Das "ungenauere" lastLogonTimestamp Attribut wird auf alle DC's repliziert. Wie man sieht, ist der der Wert jedoch einfach eine lange Zahl. Diese entspricht 100 Nanosekunden Intervallen seit dem 01.01.1601 (UTC). Somit muss das erst noch konvertiert werden.

Mit folgendem PowerShell kann man das über das ActiveDirectory PowerShell Modul abfragen

#LastLogonTimestamp

$SamAccountName = "a.bohren"

$User = Get-ADUser -Identity $SamAccountName -Properties Mail,LastLogonTimestamp

If ($User.LastLogonTimestamp -ne $null)

{

Write-Host "LastLogonTimestamp: $($User.LastLogonTimestamp)" -ForegroundColor Cyan

$LastLogonDate = [datetime]::FromFileTime($user.LastLogonTimestamp).ToString('s')

Write-Host "$SamAccountName -> $LastLogonDate" -ForegroundColor Green

} else {

Write-Host "$SamAccountName -> N/A" -ForegroundColor Green

}

Will man es genauer haben, so muss man das AD Attribut LastLogon auf allen DomainControllern auswerten.

Die AD Domäne und die Domaincontroller erhält man mit folgenden PowerShell cmdlets

Get-ADDomain | ft DNSRoot, Forest

Get-ADDomainController -Filter * | ft Name, Hostname, Site, ipv4Address, ipv6address

Mit folgendem Script hole ich mir das Attribut LastLogon von jedem DomainController und füge die einem Array hinzu. Anschliessend wird das Array Absteigend sortiert und der oberste Eintrag selektiert. Danach wird das Datum konvertiert.

#LastLogon
$ArrayDC = Get-ADDomainController -Filter * | select Hostname
 
$SamAccountName = "a.bohren"
$ArrayLastLogon = @()
Foreach ($DC in $ArrayDC.Hostname)
 {
$ADUser = Get-ADUser -Identity $SamAccountName -Properties LastLogon, LastLogonTimestamp -Server $DC
$ArrayLastLogon += $ADUser.LastLogon
Write-Host "DC: $DC --> $($ADUser.LastLogon)" -ForegroundColor Cyan
}
 
If ($ArrayLastLogon -ne $null)
{
$LastLogon = $ArrayLastLogon| Sort-Object | Select-Object -First 1
$LastLogonDate = [datetime]::FromFileTime($LastLogon).ToString('s')
Write-Host "$SamAccountName -> $LastLogonDate" -ForegroundColor Green
} else {
Write-Host "$SamAccountName -> N/A" -ForegroundColor Green
}

Grüsse
Andres Bohren