Windows / Active Directory 24 марта 2026 9 мин чтения
ЕС
Евгений Семёнов
Генеральный директор ООО АйТи Фреш · 15+ лет в IT

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

active-directory-last-logon-audit

Один из самых распространённых запросов в работе системного администратора — «кто из пользователей давно не заходил в домен?». Это может потребоваться при плановой чистке устаревших учётных записей, аудите безопасности, подготовке к переходу на новую версию AD или просто при расследовании инцидента. Задача кажется простой, но на практике она имеет несколько нюансов, о которых стоит знать заранее.

В этой статье разберём все актуальные методы получения информации о последнем входе пользователей Active Directory с помощью PowerShell — от быстрого однострочника до точного опроса всех контроллеров домена.

Почему LastLogonDate не всегда точен

В Active Directory существует два атрибута, связанных со временем последнего входа: LastLogonDate и lastLogon. Они принципиально различаются по поведению, и это важно понимать перед тем, как строить отчёты.

Вывод: для оперативных задач и массовых отчётов подходит LastLogonDate. Для точного аудита безопасности или расследования инцидентов — нужно опрашивать все контроллеры домена и брать максимальное значение lastLogon.

Совет: если в домене только один контроллер, оба атрибута будут показывать одинаковый результат. Реальные расхождения возникают в средах с несколькими DC.

Предварительные требования

Для работы всех приведённых скриптов необходим модуль 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"
Внимание: скрипт опрашивает каждый DC для каждого пользователя. В крупном домене (тысячи пользователей, несколько DC) выполнение может занять несколько минут. Запускайте в нерабочее время или используйте фильтр по OU.

Поиск неактивных учётных записей

Один из ключевых сценариев применения этих данных — выявление учёток, которые давно не использовались. Это важно с точки зрения безопасности: «мёртвые» аккаунты могут стать вектором атаки, если их пароль никто не меняет.

# Найти активных пользователей, не входивших более 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"
Совет: сохраняйте CSV-файлы с датой в имени (например, LastLogon_2026-03-24.csv), чтобы иметь историю изменений и возможность сравнивать данные за разные периоды.

Что делать с неактивными учётными записями

После получения списка неактивных пользователей стандартная практика такова:

  1. Уточнить у руководителя — возможно, сотрудник в отпуске, командировке или на больничном.
  2. Отключить учётку (не удалять) командой Disable-ADAccount -Identity username — это безопасный первый шаг.
  3. Переместить в карантинную OU — создайте специальное подразделение «Disabled Users» и переносите туда отключённые аккаунты.
  4. Удалить через 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+ лет опыта, сертифицированные инженеры, собственная инфраструктура.

15+лет опыта
25+клиентов
8серверов Dell