AD: Как посмотреть last logon всех пользователей
Ниже — несколько проверенных способов посмотреть LastLogon всех пользователей в AD (от простого и быстрого до точного, но более тяжёлого). Всё — PowerShell (нужен модуль ActiveDirectory, запускайте от учётки с правами чтения AD).
Быстрый и удобный
Использует свойство LastLogonDate — легко читается и реплицируется (но с погрешностью —≈14 дней по умолчанию).
|
1 2 3 4 5 6 |
# Получить всех пользователей с LastLogonDate и сохранить в CSV Import-Module ActiveDirectory Get-ADUser -Filter * -Properties LastLogonDate, Enabled | Select-Object Name, SamAccountName, Enabled, LastLogonDate | Sort-Object -Property LastLogonDate -Descending | Export-Csv -Path C:\-\AD_LastLogon_AllUsers.csv -NoTypeInformation -Encoding UTF8 |
Если нужно быстро посмотреть в консоли (one-liner)
|
1 2 3 4 |
Get-ADUser -Filter * -Properties LastLogonDate | Select-Object Name, SamAccountName, LastLogonDate | Sort-Object LastLogonDate -Descending | Format-Table -AutoSize |
Точное (authoritative) значение — когда нужна 100% точность
lastLogon хранится на каждом контроллере домена и не реплицируется.
Чтобы получить точное последнее время входа — надо опросить все DC и взять максимум значений.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Import-Module ActiveDirectory # Список всех DC $DCs = Get-ADDomainController -Filter * # Получаем всех пользователей (можно ограничить фильтром) $users = Get-ADUser -Filter * -Properties SamAccountName $result = foreach ($u in $users) { $maxLogon = 0 foreach ($dc in $DCs) { try { $userOnDC = Get-ADUser -Identity $u.SamAccountName -Server $dc.HostName -Properties lastLogon if ($userOnDC -and $userOnDC.lastLogon -and ($userOnDC.lastLogon -gt $maxLogon)) { $maxLogon = $userOnDC.lastLogon } } catch { # пропускаем ошибки чтения с DC } } # Конвертируем FileTime -> DateTime (0 -> $null) if ($maxLogon -gt 0) { $lastLogonDate = [DateTime]::FromFileTime($maxLogon) } else { $lastLogonDate = $null } [PSCustomObject]@{ Name = $u.Name SamAccount = $u.SamAccountName LastLogon = $lastLogonDate Enabled = $u.Enabled } } # Сохраняем $result | Sort-Object LastLogon -Descending | Export-Csv C:\-\AD_LastLogon_Accurate.csv -NoTypeInformation -Encoding UTF8 |
Этот скрипт более медленный (опрашивает каждый DC для каждого пользователя), но даёт максимально точное время входа.
Пояснения / советы
- LastLogonDate (и lastLogonTimestamp) реплицируются с задержкой — lastLogonTimestamp обычно округлён и может отставать (по умолчанию ~14 дней). Для быстрых отчётов используйте LastLogonDate.
- Для полной точности — используйте скрипт опроса всех DC (как выше) и берите максимум lastLogon.
- Если у вас много пользователей/контроллеров — выполните точечный запрос по группе пользователей (фильтр), иначе будет долго.
- Требуется модуль ActiveDirectory (RSAT) — на контроллере или на рабочей станции с RSAT и правами чтения AD.
- Если вы хотите исключить неактивные/заблокированные учётки, добавьте -Filter {Enabled -eq $true} в Get-ADUser или фильтруйте результат.
Полезные примеры фильтрации
Пользователи, которые не входили >90 дней (по LastLogonDate):
|
1 2 3 4 5 |
$cutoff = (Get-Date).AddDays(-90) Get-ADUser -Filter * -Properties LastLogonDate | Where-Object { $_.LastLogonDate -lt $cutoff -or -not $_.LastLogonDate } | Select Name, SamAccountName, LastLogonDate | Export-Csv C:\-\AD_NotLogged90days.csv -NoTypeInformation |