Как получить нормальную дату у lastLogon, lastLogonTimestamp, badPasswordTime
Добрый день! Уважаемые читатели и гости одного из крупнейших 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
| Select SamAccountName, CN, Modified, Enabled, lastLogon, LastLogonDate, lastLogonTimestamp, DistinguishedName | FT
Вы можете заметить, что lastLogon и lastLogonTimestamp имеют значения даты в виде простого набора цифр, по которому очень сложно понять, что за дата.
В то же время если вы откроете оснастку "Active Directory - Пользователи и компьютеры", то вы увидите, что у моего тестового пользователя в атрибутах lastLogon, lastLogonTimestamp, badPasswordTime стоят нормальные и привычные глазу значения даты в виде 12.02.2020 19:15:34 RTZ 2 (зима), но если зайти в редактирование, то там будет просто набор последовательных цифр.
Как преобразовать системную дату в календарную через PowerShell
Такой формат даты 132181188021882296 называется системный и он измеряется в тиках по 100 наносекунд, отчет которых идет от 1 января 1601 00:00: 00 UT, в таком виде оно отображается и в атрибутах Active Directory.
Мы же привыкли к календарному виду, где есть четко выраженная дата и время 21.02.2020 12:17:31. Ниже я вас научу, как вы можете через PowerShell преобразовывать системное время в календарное.
Давайте я в качестве теста возьму значение из атрибута lastLogon (132259977349862572). Откройте оснастку PowerShell и введите;
В итоге я вижу в календарном виде, что пользователь Барбоскин Геннадий последний раз логинился 12 февраля 2020 г. 19:15:34.
Или есть еще старая утилита w32tm.exe. Введите команду:
Теперь, чтобы нам в скрипте PowerShell, налету преобразовывать системное время в календарное, вы можете воспользоваться конструкцией @{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}} и {n='badPasswordTime';e={(Get-Date 1/1/1601).AddDays($_.badPasswordTime)}}. Приведу рабочий пример запроса по пользователям.
| 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
В итоге я вижу, что столбцы lastLogon, lastLogonTimestamp, badPasswordTime имеют читабельный вид.
Преобразование 18-ти значных меток времени LDAP в календарный формат online
Я могу вам порекомендовать удобный сервис, который поможет вам перевести системное время в нормальное, одной кнопкой. Зайдите по ссылке:
На этом у меня все, пусть машины смотрят на дату в виде тиков, а мы люди в привычном нам календарном виде. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.