我正在使用Powershell来确定域帐户的密码到期日期。我已使用以下命令获取此信息:
Get-ADUser -Filter {SamAccountName -eq "<username>"} -Properties "DisplayName" , "msDS-UserPasswordExpiryTimeComputed"
然后,我使用以下方法将该值隐式更改为有意义的日期:
[datetime]::FromFileTime(<computed filetime from above command>)
这对我使用的所有域(一个除外)都适用。在该域中,我得到的值为9223372036854775807
作为msDS-UserPasswordExpiryTimeComputed
。我无法使用FromFileTime
函数将此数字转换为日期。它抛出错误。经过研究,我发现该数字表示密码设置为不过期。但是,我知道密码确实在该域中过期。此外,来自PasswordNeverExpires
cmdlet的Get-ADUser
属性显示为False
。
如何从9223372036854775807
属性中获取msDS-UserPasswordExpiryTimeComputed
,并从False
属性中获取PasswordNeverExpires
?这似乎是一个矛盾。我想念什么?还有其他情况,msDS-UserPasswordExpiryTimeComputed
也可能是9223372036854775807
吗?谢谢。
答案 0 :(得分:2)
documentation列出了几种条件,其中msDS-UserPasswordExpiryTimeComputed
返回9223372036854775807
aka 0x7fffffffffffffff
aka [int64]::MaxValue
(TO
指给定的 t arget o bject):
如果在
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!userAccountControl
位中的任何一位,则{{1 }} =TO!msDS-UserPasswordExpiryTimeComputed
。
[...]
否则,如果0x7FFFFFFFFFFFFFFF
,则Effective-MaximumPasswordAge = 0x8000000000000000
=TO!msDS-UserPasswordExpiryTimeComputed
(其中0x7FFFFFFFFFFFFFFF
在[MS-SAMR]第3.1.1.5节中定义)。
在不了解所有详细信息的情况下,似乎Effective-MaximumPasswordAge
属性返回msDS-UserPasswordExpiryTimeComputed
表示有效没有密码到期,由于各种原因,只有其中一个是将0x7FFFFFFFFFFFFFFF
设置为PasswordNeverExpires
。
因此,您可以过滤掉这些值:
$True
甚至可以将Get-ADUser -Filter "SamAccountName -eq '<username>'" `
-Properties DisplayName, msDS-UserPasswordExpiryTimeComputed | #`
Where { $_.msDS-UserPasswordExpiryTimeComputed -ne 0x7FFFFFFFFFFFFFFF } | ForEach {
# ...
$dt = [datetime]::FromFileTime($_.msDS-UserPasswordExpiryTimeComputed)
}
的测试合并到0x7FFFFFFFFFFFFFFF
参数中。
顺便说一句:请注意,我使用了 string 而不是脚本块(-Filter
作为{ ... }
参数,因为使用了脚本块是best avoided。
答案 1 :(得分:1)
我目前没有DC可以测试,但从理论上讲这可以工作。
使用Get-ADDefaultDomainPasswordPolicy -Identity Domain.com
获取用户passwordLastSet
的{{1}}属性,如下所示:(Get-ADUser -Identity <UserName> -Properties *).PasswordlastSet
并根据域的区域性:Ref {{1}转换为适当的[datetime]
对象}。 Get-Culture
格式可能会根据美国和英国等区域设置而更改。
现在您有DateTime
个60天和passwordpolicy
日期,这很简单,可以确定密码是否到期。
或者,在2016年的服务器上,您也可以使用类似的东西:
passwordlastset