В документации перечислены несколько условий, при которых msDS-UserPasswordExpiryTimeComputed
возвращает 9223372036854775807
aka 0x7fffffffffffffff
aka [int64]::MaxValue
(TO
относится к данному t arget o bject):
Если в TO!userAccountControl
установлен какой-либо из битов ADS_UF_SMARTCARD_REQUIRED
, ADS_UF_DONT_EXPIRE_PASSWD
, ADS_UF_WORKSTATION_TRUST_ACCOUNT
, ADS_UF_SERVER_TRUST_ACCOUNT
, ADS_UF_INTERDOMAIN_TRUST_ACCOUNT
, то TO!msDS-UserPasswordExpiryTimeComputed
= 0x7FFFFFFFFFFFFFFF
.
[...]
Иначе, если Effective-MaximumPasswordAge = 0x8000000000000000
, то TO!msDS-UserPasswordExpiryTimeComputed
= 0x7FFFFFFFFFFFFFFF
(где Effective-MaximumPasswordAge
определено в разделе 3.1.1.5 [MS-SAMR]).
Не зная всех деталей, кажется, что свойство msDS-UserPasswordExpiryTimeComputed
, возвращающее 0x7FFFFFFFFFFFFFFF
, указывает на то, что эффективно не имеет срока действия пароля, по разным причинам, только one из которых PasswordNeverExpires
устанавливается на $True
.
Следовательно, вы можете отфильтровать такие значения:
Get-ADUser -Filter "SamAccountName -eq '<username>'" `
-Properties DisplayName, msDS-UserPasswordExpiryTimeComputed | #`
Where { $_.msDS-UserPasswordExpiryTimeComputed -ne 0x7FFFFFFFFFFFFFFF } | ForEach {
# ...
$dt = [datetime]::FromFileTime($_.msDS-UserPasswordExpiryTimeComputed)
}
Может даже оказаться возможным включить тест для 0x7FFFFFFFFFFFFFFF
в аргумент -Filter
.
В качестве отступления: обратите внимание, что я использовал строку вместо блока скрипта ({ ... }
) в качестве аргумента -Filter
, потому что использование блоков скрипта лучше всего избегать .