Многие, кто работает с Active Directory наверняка замечали довольно своеобразный формат дат в AD, например:

Где 131674282253386100 = Thursday, April 05, 2018 9:57:05 PM, а теперь смотрим в качестве примера вывод PS по любому из выбранных пользователей:
Get-ADUser UserName -Properties cn, LockedOut, pwdLastSet, ` badPwdCount, badPasswordTime, lastLogon, lastLogonTimeStamp, ` whenCreated, whenChanged
Результат:
badPasswordTime : 130271822015564526 CN : UserName Enabled : True ... lastLogon : 130271824649409984 lastLogonTimeStamp : 130271821324223446 LockedOut : False ...
Особенно примечательны результаты по атрибутам:
- badPasswordTime
- lastLogon
- lastLogonTimeStamp
Пробуем конвернтуть lastLogonTimeStamp в человеко-понятный вид используя функцию PS:
[datetime]::FromFileTime("130271821324223446")
Результат:
Friday, October 25, 2013 4:42:12 PM
С учетом статуса Enabled : True, это вообще никак не хорошо :) Пробуем на лету конвертнуть нужные нам аттрибуты:
Get-ADUser UserName -Properties Name,LastLogon,lastLogonTimeStamp | Select-Object Name,@{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}},@{n='lastLogonTimeStamp';e={[DateTime]::FromFileTime($_.lastLogonTimeStamp)}} | Format-Table -Auto
Результат:
Name LastLogon lastLogonTimeStamp ---- --------- ------------------ UserName 10/25/2013 4:47:44 PM 10/25/2013 4:42:12 PM
Как конвертировать дату в AD TimeStamp
Это бывает удобно при использовании LDAP Query например, здесь можно так-же использовать PS:
(Get-Date "1/1/2019").ToFileTime()
Результат:
131907636000000000
Проверяем:
[datetime]::FromFileTime("131907636000000000")
Результат:
Tuesday, January 01, 2019 12:00:00 AM
Как бонус - Отключение "старой" учетной записи при помощи PowerShell
Ну и для кучи залочим учетную запись, если ее последний логон был произведен более, чем 180 дней назад, здесь не понадобятся какие-либо конвертации:
Get-ADUser UserName -properties lastlogondate | Where-Object {$_.enabled -eq "true"-and $_.lastlogondate -lt (get-date).adddays(-180)} | Disable-ADAccount
То-же самое можно сделать массово:- используя аргумент
-Filter *
- если необходимо, можно указать месторасположение при помощи аргумента
-SearchBase "OU=MyUsers,DC=Domain,DC=local"
...
Ну уж просто отключать не интересно, так как эти учетные записи лучше поместить в определенную OU:
- для этого можно использовать пайп
| Move-ADObject –TargetPath "OU=Disabled Users, OU=MyUsers,DC=Domain,DC=local"
Ну и как говорится -
Hey, scripting guys! Good luck)
:))