Active Directory’de kullanıcıların “en son ne zaman oturum açtığı” bilgisine ulaşmak her sistem yöneticisinin mutlaka ihtiyaç duyduğu bir konudur. Ancak işin içine girince karşımıza üç farklı alan çıkar:
LastLogon, LastLogonTimeStamp ve LastLogonDate.
Peki bunlar ne demek, ne zaman hangisini kullanmalıyız?
1. LastLogon – En Kesin, Ama En Dağınık Olan
-
Bu alan, bir kullanıcının belirli bir Domain Controller (DC) üzerinden en son ne zaman oturum açtığını gösterir. Yani merkezi değildir, sadece o DC’ye özeldir.
-
Replikasyon yapılmaz. Her DC kendi verisini tutar.
-
Diyelim ki 3 DC’niz var; bir kullanıcı DC1 üzerinden oturum açtıysa, sadece DC1 bu bilgiyi bilir. DC2 ve DC3’te hâlâ eski tarih kalır.
Ne zaman kullanılır?
Gerçek zamanlı, doğru veri istiyorsanız bu alanı sorgulamalısınız. Ancak her DC’den tek tek veri çekip en yeni olanı manuel (veya script ile) karşılaştırmanız gerekir.
2. LastLogonTimeStamp – Yaklaşık Bilgi, Ama Replike Edilir
-
Bu alan, tüm DC’ler arasında replike edilen tek oturum bilgisi alanıdır.
-
Ancak hemen güncellenmez; 14 gün gecikmeli olarak güncellenir.
-
Microsoft bu gecikmeyi bilinçli yapar, çünkü her girişte anında replikasyon sistemi yavaşlatabilir.
-
Özellikle kullanıcı sık sık oturum açıyorsa, veri daha geç güncellenir.
Ne zaman kullanılır?
Toplu raporlar, inaktif kullanıcı tespiti, lisans optimizasyonu gibi işlemlerde kullanılır. Çok hassas bilgi gerekmezse gayet yeterlidir.
3. LastLogonDate – PowerShell’de Kullanıcı Dostu Görünüm
-
Aslında bu alan,
LastLogonTimeStamp
‘in tarih formatına çevrilmiş halidir. -
PowerShell komutu
Get-ADUser -Properties LastLogonDate
dediğinizde, arka plandaLastLogonTimeStamp
alanı okunur ama size daha okunabilir bir formatta gösterilir.
Ne zaman kullanılır?
Hızlıca kullanıcıların son giriş tarihini toplu görmek istediğinizde, özellikle PowerShell raporlarında oldukça işlevseldir.
Peki Hangisini Kullanmalıyız?
İhtiyacınız | En Uygun Alan |
---|---|
Gerçek zamanlı, doğru login bilgisi | LastLogon (her DC’den çekilmeli) |
Raporlama, inaktif kullanıcı temizliği | LastLogonTimeStamp |
PowerShell ile görsel ve sade çıktı | LastLogonDate |
Biz bu alanları değerlendirirken genelde şöyle ilerliyoruz:
-
Eğer denetim veya şüpheli oturum takibi yapıyorsak: Tüm DC’lerden
LastLogon
çekiyoruz ve en güncel olanı referans alıyoruz. -
Eğer amacımız aktif olmayan kullanıcıları bulup temizlemek ya da lisans yükünü azaltmak ise:
LastLogonTimeStamp
yeterli oluyor. -
PowerShell ile IT ekibine hızlı rapor çıkarmamız gerekiyorsa:
LastLogonDate
ile basit ve okunabilir tablolar oluşturuyoruz.
LastLogonTimeStamp güncellemesi için olan 14 günlük süreyi kısaltmak isteyebilirsiniz. Active Directory üzerindeki ms-DS-Logon-Time-Sync-Interval özelliğini kısaltmak isterseniz aşağıdaki powershell komutu ile bunu yapabilirsiniz. Örnek komut 7 gün içindir. Bu değişikliğin replikasyon trafiğinde artış yapacağını da tabi ki söylemezsek olmaz.
Set-ADObject -Identity “CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=yourdomain,DC=com” -Partition “CN=Configuration,DC=yourdomain,DC=com” -Add @{msDS-LogonTimeSyncInterval=7}
Ekteki script de tüm DC ‘lerden rapor çekerek rapor almanız için kullanılabilir.
Sorun yaşamanız durumda geri bildirimde bulunabilirsiniz.
Diğer active directory konuları için link.
# Tüm kullanıcılar için LastLogon, LastLogonTimeStamp ve LastLogonDate bilgilerini alır
# Sonuçları CSV olarak dışa aktarırImport-Module ActiveDirectory
# Domain’deki tüm Domain Controller’ları al
$DCs = Get-ADDomainController -Filter *# Raporu tutacak dizi
$results = @()# Tüm kullanıcıları al (filtrelenebilir)
$users = Get-ADUser -Filter * -Properties LastLogonTimeStampforeach ($user in $users) {
$latestLogon = 0
foreach ($dc in $DCs) {
# Her DC’den LastLogon değeri çek
$logon = (Get-ADUser $user.SamAccountName -Server $dc.HostName -Properties LastLogon).LastLogon
if ($logon -gt $latestLogon) {
$latestLogon = $logon
}
}# LastLogonTimeStamp ve LastLogonDate hesapla
$llts = if ($user.LastLogonTimeStamp) { [DateTime]::FromFileTime($user.LastLogonTimeStamp) } else { $null }
$lld = if ($llts) { $llts.ToString(“yyyy-MM-dd HH:mm”) } else { “Yok” }# Sonuçları ekle
$results += [PSCustomObject]@{
KullaniciAdi = $user.SamAccountName
AdSoyad = $user.Name
EnGuncelLastLogon = if ($latestLogon) { [DateTime]::FromFileTime($latestLogon).ToString(“yyyy-MM-dd HH:mm”) } else { “Yok” }
LastLogonTimeStamp = if ($llts) { $llts.ToString(“yyyy-MM-dd HH:mm”) } else { “Yok” }
LastLogonDate_PSh = $lld
}
}# Sonuçları CSV olarak dışa aktar (isteğe bağlı)
$results | Export-Csv -Path “LastLogonReport.csv” -NoTypeInformation -Encoding UTF8# Ekrana yazdır
$results | Format-Table -AutoSize