Используя Active Directory, системный администратор постоянно сталкивается с необходимостью получить и систематизировать информацию о пользователях. Сегодня поговорим о двух атрибутах учётных записей, которые показывают дату и время последнего входа. Это LastLogon и LastLogonTimestamp. Если вы используете модуль Active Directory для PowerShell, то, скорее всего, замечали необычные значения этих атрибутов. Сделаем так, чтобы значения этих атрибутов имели привычный нам вид даты и времени.
Напомню, для просмотра атрибутов учётных записей в Active Directory через PowerShell нужно, чтобы последний был не ниже второй версии, а в операционной системе должен присутствовать модуль Active Directory для PowerShell. В этом случае мы можем посмотреть время последнего входа в систему через LastLogon или LastLogonTimestamp. Лучше использовать последний. Дальше вы поймёте почему. А начнём с LastLogon.
Для просмотра даты и времени последнего входа можно использовать вот такую конструкцию:
Get-ADUser -SearchBase 'OU=Users,OU=Moscow,DC=Domain' -filter * -properties LastLogon | ft Name, LastLogon
Таким нехитрым способом мы посмотрели время последнего входа у пользователей, что располагаются в конкретном OU, и расположили их в виде таблицы. Не забудьте заменить значения OU и DC на ваши.
Обратите внимание на скриншот ниже. Дата и время на нём, мягко говоря, не совсем читабельные. А у некоторых пользователей их и вовсе нет.
Что такое 132440351838433686? Это дата и время, записанные в системном формате. Он измеряется в тиках по 100 наносекунд, отсчёт которых идёт с 1 января 1601 года 00:00:00 UT. Давайте преобразуем эту запись в более привычный для нас формат:
Get-ADUser -SearchBase 'OU=Users,OU=Moscow,DC=Domain' -filter * -properties LastLogon | ft Name, @{n='LastLogon';e={[DateTime]::FromFileTime($_.LasLogon)}}
Теперь читать дату и время намного удобнее. Если раньше у некоторых пользователей дата и время последнего входа отсутствовали вовсе, то теперь у таких пользователей мы видим дату 01.01.1601. Дата, конечно, не имеет ничего общего с реальностью. Но мы помним, что именно от неё начинает свой отсчёт системное время. К этой дате мы ещё вернёмся. А пока выгрузим полученную информацию в файл. Например, в CSV-файл. Для этого добавим ещё один элемент в наш конвейер.
Get-ADUser -SearchBase 'OU=Users,OU=Moscow,DC=Domain' -filter * -properties LastLogon | Select-Object Name, @{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}} | Export-Csv "C:\LastLogon.csv" -Delimiter ";" -Encoding Unicode
Путь сохранения файла, разделитель и кодировка — по вкусу.
Пытливый читатель, возможно, заметил, что здесь мы использовали Select-Object. FT тут работать не будет.
Ну а теперь о пустых значениях LastLogon у некоторых пользователей. И о том, почему лучше использовать LastLogonTimestamp. Дело в том, что LastLogon не реплицируется контроллерами домена, а LastLogonTimestamp реплицируется. Правда и тут может быть погрешность от 9 до 14 дней. Потому что именно в такие сроки контроллеры домена реплицируют атрибут LastLogonTimestamp. Сделано это для минимизации трафика. При каждой регистрации пользователя контроллер анализирует значение LastLogonTimestamp, затем контроллер выбирает случайное число между 9 и 14. Если число дней между событием последней регистрации и текущим моментом меньше выбранного числа, то контроллер не обновляет значение LastLogonTimestamp у этого пользователя.
Get-ADUser -SearchBase 'OU=Users,OU=Moscow,DC=Domain' -filter * -properties LastLogonTimestamp | ft Name, @{n='LastLogonTimestamp';e={[DateTime]::FromFileTime($_.LastLogonTimestamp)}}
В этот раз дата и время последнего входа есть у всех пользователей. Но помните, что это не самые точные дата и время входа.
Напоследок приведу пример экспорта LastLogonTimestamp в CSV.
Get-ADUser -SearchBase 'OU=Users,OU=Moscow,DC=Domain' -filter * -properties LastLogonTimestamp | Select-Object Name, @{n='LastLogonTimestamp';e={[DateTime]::FromFileTime($_.LastLogonTimestamp)}} | Export-Csv "C:\LastLogonTimestamp.csv" ";" -Encoding Unicode
Теперь вы знаете как посмотреть дату последнего входа пользователя в PowerShell в удобном формате.
Статьи по теме: