Active Directory: аудит последнего входа пользователей через PowerShell

Один из самых распространённых запросов в работе системного администратора — «кто из пользователей давно не заходил в домен?». Это может потребоваться при плановой чистке устаревших учётных записей, аудите безопасности, подготовке к переходу на новую версию AD или просто при расследовании инцидента. Задача кажется простой, но на практике она имеет несколько нюансов, о которых стоит знать заранее.
В этой статье разберём все актуальные методы получения информации о последнем входе пользователей Active Directory с помощью PowerShell — от быстрого однострочника до точного опроса всех контроллеров домена.
Почему LastLogonDate не всегда точен
В Active Directory существует два атрибута, связанных со временем последнего входа: LastLogonDate и lastLogon. Они принципиально различаются по поведению, и это важно понимать перед тем, как строить отчёты.
- LastLogonDate — реплицируемый атрибут. Он обновляется при входе пользователя, но синхронизируется между контроллерами домена с задержкой — по умолчанию раз в 9–14 дней. Это удобно: значение доступно с любого DC, но может «отставать» от реальности.
- lastLogon — нереплицируемый атрибут. Он хранится только на том контроллере домена, который аутентифицировал пользователя, и всегда содержит точное время последнего входа именно через этот DC.
Вывод: для оперативных задач и массовых отчётов подходит LastLogonDate. Для точного аудита безопасности или расследования инцидентов — нужно опрашивать все контроллеры домена и брать максимальное значение lastLogon.
Предварительные требования
Для работы всех приведённых скриптов необходим модуль ActiveDirectory. Он входит в состав RSAT (Remote Server Administration Tools) и доступен как на серверах с ролью AD DS, так и на рабочих станциях с установленными инструментами администратора.
Проверить наличие модуля и установить его при необходимости:
# Проверка наличия модуля
Get-Module -ListAvailable ActiveDirectory
# Установка RSAT на Windows 10/11 (требует прав администратора)
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
Все скрипты запускаются от имени учётной записи с правами на чтение объектов AD (как правило, достаточно обычных доменных прав).
Метод 1: Быстрый отчёт через LastLogonDate
Самый простой способ — использовать командлет Get-ADUser с запросом свойства LastLogonDate. Этот метод работает быстро, не нагружает инфраструктуру и подходит для большинства повседневных задач.
# Получить всех пользователей с датой последнего входа, отсортировать и экспортировать в CSV
Get-ADUser -Filter * -Properties LastLogonDate, DisplayName, Enabled |
Select-Object Name, DisplayName, SamAccountName, LastLogonDate, Enabled |
Sort-Object LastLogonDate -Descending |
Export-Csv -Path "C:\Reports\LastLogon.csv" -NoTypeInformation -Encoding UTF8
После выполнения файл LastLogon.csv будет содержать таблицу со всеми пользователями домена. Столбец Enabled позволяет сразу отделить активные учётки от отключённых.
-SearchBase "OU=Users,DC=domain,DC=local" к Get-ADUser, чтобы ограничить поиск конкретным подразделением и не захватывать служебные учётки.Метод 2: Быстрый просмотр в консоли (однострочник)
Если нужно быстро посмотреть данные прямо в терминале без сохранения файла, используйте компактный вариант:
# Вывод таблицы последних входов в консоль
Get-ADUser -Filter * -Properties LastLogonDate |
Select-Object Name, SamAccountName, LastLogonDate |
Sort-Object LastLogonDate -Descending |
Format-Table -AutoSize
Этот вариант удобен при работе напрямую на контроллере домена или через PSRemoting — когда нет необходимости сохранять результат, а нужно только взглянуть на картину.
Метод 3: Точный аудит через опрос всех контроллеров домена
Когда точность критична — например, при расследовании инцидента или проверке привилегированных учётных записей — необходимо опросить каждый DC отдельно и взять максимальное значение lastLogon. Этот атрибут не реплицируется, поэтому только такой подход даёт гарантированно точный результат.
# Точный аудит: опрос всех DC и получение максимального lastLogon
$DCs = Get-ADDomainController -Filter *
$Users = Get-ADUser -Filter * -Properties DisplayName, SamAccountName, Enabled
$Results = foreach ($User in $Users) {
$MaxLastLogon = $null
foreach ($DC in $DCs) {
try {
$DCUser = Get-ADUser $User.SamAccountName `
-Server $DC.HostName `
-Properties lastLogon -ErrorAction Stop
if ($DCUser.lastLogon -gt $MaxLastLogon) {
$MaxLastLogon = $DCUser.lastLogon
}
} catch {
# Пропускаем DC, если он недоступен
}
}
[PSCustomObject]@{
Name = $User.Name
SamAccountName = $User.SamAccountName
DisplayName = $User.DisplayName
Enabled = $User.Enabled
LastLogonExact = if ($MaxLastLogon) {
[DateTime]::FromFileTime($MaxLastLogon)
} else { $null }
}
}
$Results |
Sort-Object LastLogonExact -Descending |
Export-Csv -Path "C:\Reports\LastLogon_Exact.csv" -NoTypeInformation -Encoding UTF8
Write-Host "Готово. Результат сохранён в C:\Reports\LastLogon_Exact.csv"
Поиск неактивных учётных записей
Один из ключевых сценариев применения этих данных — выявление учёток, которые давно не использовались. Это важно с точки зрения безопасности: «мёртвые» аккаунты могут стать вектором атаки, если их пароль никто не меняет.
# Найти активных пользователей, не входивших более 90 дней
$ThresholdDate = (Get-Date).AddDays(-90)
Get-ADUser -Filter {Enabled -eq $true} -Properties LastLogonDate, DisplayName |
Where-Object {
$_.LastLogonDate -lt $ThresholdDate -or $_.LastLogonDate -eq $null
} |
Select-Object Name, SamAccountName, DisplayName, LastLogonDate |
Sort-Object LastLogonDate |
Export-Csv -Path "C:\Reports\InactiveUsers_90days.csv" -NoTypeInformation -Encoding UTF8
Write-Host "Найдено неактивных пользователей: $((Import-Csv 'C:\Reports\InactiveUsers_90days.csv').Count)"
Обратите внимание: в фильтр добавлено условие $_.LastLogonDate -eq $null — это учётки, которые вообще никогда не использовались для входа. Это особенно актуально для тестовых или служебных аккаунтов.
Фильтрация по конкретному подразделению (OU)
В большинстве организаций пользователи распределены по организационным единицам: отделы, филиалы, типы учёток (сотрудники, сервисные аккаунты, временные пользователи). Добавление параметра -SearchBase позволяет сократить область поиска и сделать отчёты более управляемыми.
# Аудит только пользователей из подразделения "Сотрудники"
$OU = "OU=Sotrudniki,OU=Users,DC=company,DC=local"
Get-ADUser -Filter * -SearchBase $OU -Properties LastLogonDate, Department |
Select-Object Name, SamAccountName, Department, LastLogonDate, Enabled |
Sort-Object LastLogonDate -Descending |
Export-Csv -Path "C:\Reports\Sotrudniki_LastLogon.csv" -NoTypeInformation -Encoding UTF8
Автоматизация: плановый запуск через Task Scheduler
Аудит последнего входа имеет смысл запускать регулярно — например, раз в неделю. Это позволяет отслеживать тенденцию и своевременно реагировать на появление неактивных учётных записей. Создать задание в планировщике через PowerShell:
# Создать задание для еженедельного запуска скрипта аудита
$Action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-NonInteractive -File C:\Scripts\LastLogonAudit.ps1"
$Trigger = New-ScheduledTaskTrigger `
-Weekly -DaysOfWeek Monday -At "08:00"
$Settings = New-ScheduledTaskSettingsSet `
-RunOnlyIfNetworkAvailable `
-StartWhenAvailable
Register-ScheduledTask `
-TaskName "AD LastLogon Weekly Audit" `
-Action $Action `
-Trigger $Trigger `
-Settings $Settings `
-RunLevel Highest `
-Description "Еженедельный аудит последнего входа пользователей AD"
Что делать с неактивными учётными записями
После получения списка неактивных пользователей стандартная практика такова:
- Уточнить у руководителя — возможно, сотрудник в отпуске, командировке или на больничном.
- Отключить учётку (не удалять) командой
Disable-ADAccount -Identity username— это безопасный первый шаг. - Переместить в карантинную OU — создайте специальное подразделение «Disabled Users» и переносите туда отключённые аккаунты.
- Удалить через 30–90 дней — если учётка не понадобилась, удалить окончательно командой
Remove-ADUser.
# Отключить учётную запись и переместить в карантинную OU
$Username = "j.ivanov"
$DisabledOU = "OU=Disabled,DC=company,DC=local"
Disable-ADAccount -Identity $Username
Move-ADObject -Identity (Get-ADUser $Username).DistinguishedName -TargetPath $DisabledOU
Write-Host "Учётка $Username отключена и перемещена в $DisabledOU"
Роль IT-аутсорсинга в аудите Active Directory
Регулярный аудит Active Directory — это рутинная, но критически важная задача для безопасности инфраструктуры. На практике во многих компаниях малого и среднего бизнеса она выполняется нерегулярно или не выполняется вовсе: нет выделенного администратора, нет формализованных процедур, нет автоматизации.
Именно здесь системный администратор на аутсорсинге приносит наибольшую ценность. В рамках договора IT-обслуживания можно настроить автоматические отчёты по Active Directory, выстроить процедуру отключения уволенных сотрудников и провести комплексный аудит текущего состояния домена. Это снижает риски компрометации учётных данных и обеспечивает соответствие внутренним политикам безопасности.
Официальная документация: Microsoft Learn — Active Directory, Microsoft Learn — PowerShell
Часто задаваемые вопросы
Что такое Active Directory: аудит последнего входа пользователей через PowerShell?
Active Directory: аудит последнего входа пользователей через PowerShell — это важный аспект системного администрирования, который позволяет настроить и оптимизировать работу IT-инфраструктуры. В данной статье подробно рассматриваются все ключевые моменты.
Как правильно настроить Active Directory: аудит последнего входа пользователей через PowerShell?
Для корректной настройки Active Directory: аудит последнего входа пользователей через PowerShell необходимо следовать пошаговой инструкции, представленной в статье выше. Важно учитывать особенности вашей инфраструктуры и требования безопасности.
Какие типичные ошибки возникают при работе с Active Directory: аудит последнего входа пользователей через PowerShell?
Наиболее частые ошибки при работе с Active Directory: аудит последнего входа пользователей через PowerShell: некорректная конфигурация, недостаточные права доступа и несовместимость версий. Рекомендуем обратиться к специалистам ITFresh для профессиональной настройки.
Возьмём это на себя
Настройка и администрирование Active Directory — наша ежедневная работа. 15+ лет опыта, сертифицированные инженеры, собственная инфраструктура.