Как получить нормальную дату у lastLogon, lastLogonTimestamp, badPasswordTime

Обновлено 02.03.2020

powerShellДобрый день! Уважаемые читатели и гости одного из крупнейших IT порталов в рунете по компьютерным технологиям Pyatilistnik.oeg. В прошлый раз я вам подробно рассказал, что такое WDS сервер, как он может вам помочь вашей повседневной жизни и с какими сложностями вы можете столкнуться. Сегодня мы с вами научимся конвертировать значения из атрибутов lastLogon, lastLogonTimestamp, badPasswordTime в нормальный, привычный вид 13.02.2020 9:44:57.

Описание задачи

Когда у вас есть среда Active Directory, то вы со 100% вероятностью будите использовать различные сценарии PowerShell, по получению разных данных, например "Поиск компьютеров по операционной системе" или "Поиск неактивных компьютеров в AD". В ваших отчетах очень часто могут быть задействованы атрибуты Active Directory:

  • lastLogon
  • lastLogonTimestamp
  • badPasswordTime

Атрибуты безусловно полезные, но есть одно но, они изначально выводятся в очень непривычном формате дат, например 132181188021882296. Приведу вам пример простого скрипта, где я получаю список пользователей по атрибутам:

  • SamAccountName
  • CN
  • Modified
  • Enabled
  • lastLogon
  • LastLogonDate
  • lastLogonTimestamp
  • DistinguishedName

Get-ADUser -SearchBase 'DC=root,DC=Pyatilistnik,DC=org' -filter * -Properties SamAccountName, CN, Modified, Enabled, DistinguishedName, lastLogon, LastLogonDate, lastLogonTimestamp `
| Select SamAccountName, CN, Modified, Enabled, lastLogon, LastLogonDate, lastLogonTimestamp, DistinguishedName | FT

Вы можете заметить, что lastLogon и lastLogonTimestamp имеют значения даты в виде простого набора цифр, по которому очень сложно понять, что за дата.

Просмотр в PowerShell lastLogon и lastLogonTimestamp

В то же время если вы откроете оснастку "Active Directory - Пользователи и компьютеры", то вы увидите, что у моего тестового пользователя в атрибутах lastLogon, lastLogonTimestamp, badPasswordTime стоят нормальные и привычные глазу значения даты в виде 12.02.2020 19:15:34 RTZ 2 (зима), но если зайти в редактирование, то там будет просто набор последовательных цифр.

Просмотр параметров lastLogon, lastLogonTimestamp, badPasswordTime в ADUC

Просмотр параметров lastLogon, lastLogonTimestamp, badPasswordTime в ADUC

Как преобразовать системную дату в календарную через PowerShell

Такой формат даты 132181188021882296 называется системный и он измеряется в тиках по 100 наносекунд, отчет которых идет от 1 января 1601 00:00: 00 UT, в таком виде оно отображается и в атрибутах Active Directory.

https://en.wikipedia.org/wiki/System_time

Мы же привыкли к календарному виду, где есть четко выраженная дата и время 21.02.2020 12:17:31. Ниже я вас научу, как вы можете через PowerShell преобразовывать системное время в календарное.

Давайте я в качестве теста возьму значение из атрибута lastLogon (132259977349862572). Откройте оснастку PowerShell и введите;

[datetime]::FromFileTime("132259977349862572")

Как преобразовать системную дату в календарную через PowerShell

В итоге я вижу в календарном виде, что пользователь Барбоскин Геннадий последний раз логинился 12 февраля 2020 г. 19:15:34.

Или есть еще старая утилита w32tm.exe. Введите команду:

w32tm.exe /ntte 132259977349862572

Теперь, чтобы нам в скрипте PowerShell, налету преобразовывать системное время в календарное, вы можете воспользоваться конструкцией @{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}} и {n='badPasswordTime';e={(Get-Date 1/1/1601).AddDays($_.badPasswordTime)}}. Приведу рабочий пример запроса по пользователям.

Get-ADUser -SearchBase 'DC=root,DC=Pyatilistnik,DC=org' -filter * -properties Enabled, SamAccountName, whenCreated, whenChanged, lastLogon, logonCount, badPasswordTime, DistinguishedName `
| Select Name, Enabled, SamAccountName, whenCreated, whenChanged, @{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}}, @{n='badPasswordTime';e={(Get-Date 1/1/1601).AddDays($_.badPasswordTime)}}, logonCount, DistinguishedName | Sort-Object Enabled | FT

PowerShell преобразовывать системное время в календарное

В итоге я вижу, что столбцы lastLogon, lastLogonTimestamp, badPasswordTime имеют читабельный вид.

У атрибута LastLogon есть особенность, что когда пользователь входит в систему, этот атрибут обновляется на контроллере домена, который предоставлял ТОЛЬКО аутентификацию. Поскольку он обновляется только на одном контроллере домена, это означает, что этот атрибут не реплицируется.

Преобразование 18-ти значных меток времени LDAP в календарный формат online

Я могу вам порекомендовать удобный сервис, который поможет вам перевести системное время в нормальное, одной кнопкой. Зайдите по ссылке:

https://www.epochconverter.com/ldap

PowerShell преобразовывать системное время в календарное

На этом у меня все, пусть машины смотрят на дату в виде тиков, а мы люди в привычном нам календарном виде. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *