来自 Active Directory 的关于密码到期日期的矛盾值
Contradictory values from Active Directory regarding password expiry date
我正在使用 Powershell 确定域帐户的密码到期日期。我使用以下命令获取此信息:
Get-ADUser -Filter {SamAccountName -eq "<username>"} -Properties "DisplayName" , "msDS-UserPasswordExpiryTimeComputed"
然后我使用以下方法将此值转换为有意义的日期:
[datetime]::FromFileTime(<computed filetime from above command>)
这适用于我使用的所有域,一个域除外。在该域中,我得到 9223372036854775807
作为 msDS-UserPasswordExpiryTimeComputed
的值。我无法使用 FromFileTime
函数将此数字转换为日期。它抛出错误。经过研究,我发现这个数字意味着密码设置不会过期。但是,我知道该域中的密码确实会过期。此外,Get-ADUser
cmdlet 中的 PasswordNeverExpires
属性 显示为 False
.
如何从 msDS-UserPasswordExpiryTimeComputed
属性中获取 9223372036854775807
并从 PasswordNeverExpires
属性 中获取 False
?这似乎是一个矛盾。我错过了什么?还有其他情况 msDS-UserPasswordExpiryTimeComputed
也可能是 9223372036854775807
吗?谢谢。
documentation 列出了 几个 条件,其中 msDS-UserPasswordExpiryTimeComputed
returns 9223372036854775807
aka 0x7fffffffffffffff
aka [int64]::MaxValue
(TO
指给定的target object):
If any of the ADS_UF_SMARTCARD_REQUIRED
, ADS_UF_DONT_EXPIRE_PASSWD
, ADS_UF_WORKSTATION_TRUST_ACCOUNT
, ADS_UF_SERVER_TRUST_ACCOUNT
, ADS_UF_INTERDOMAIN_TRUST_ACCOUNT
bits is set in TO!userAccountControl
, then TO!msDS-UserPasswordExpiryTimeComputed
= 0x7FFFFFFFFFFFFFFF
.
[...]
Else, if Effective-MaximumPasswordAge = 0x8000000000000000
, then TO!msDS-UserPasswordExpiryTimeComputed
= 0x7FFFFFFFFFFFFFFF
(where Effective-MaximumPasswordAge
is defined in [MS-SAMR] section 3.1.1.5).
在不知道所有细节的情况下,似乎 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
的测试合并到 -Filter
参数中。
顺便说一句:请注意,我使用了 string 而不是脚本块 ({ ... }
) 作为 -Filter
参数,因为使用脚本块是 best avoided.
我目前没有 DC 可以测试,但理论上这可以工作。
获取Get-ADDefaultDomainPasswordPolicy -Identity Domain.com
域的密码策略
像这样获取用户的 passwordLastSet
属性:(Get-ADUser -Identity <UserName> -Properties *).PasswordlastSet
并根据域的文化转换为适当的 [datetime]
对象:Ref Get-Culture
。 DateTime
格式可能会根据美国和英国等区域设置而改变。
既然您有 passwordpolicy
(比如 60 天)和 passwordlastset
日期,确定密码是否过期是简单的数学运算。
或者,在 2016 服务器上,您也可以使用类似的东西:
Search-ADAccount -AccountExpiring -TimeSpan 10.00:00:00
我正在使用 Powershell 确定域帐户的密码到期日期。我使用以下命令获取此信息:
Get-ADUser -Filter {SamAccountName -eq "<username>"} -Properties "DisplayName" , "msDS-UserPasswordExpiryTimeComputed"
然后我使用以下方法将此值转换为有意义的日期:
[datetime]::FromFileTime(<computed filetime from above command>)
这适用于我使用的所有域,一个域除外。在该域中,我得到 9223372036854775807
作为 msDS-UserPasswordExpiryTimeComputed
的值。我无法使用 FromFileTime
函数将此数字转换为日期。它抛出错误。经过研究,我发现这个数字意味着密码设置不会过期。但是,我知道该域中的密码确实会过期。此外,Get-ADUser
cmdlet 中的 PasswordNeverExpires
属性 显示为 False
.
如何从 msDS-UserPasswordExpiryTimeComputed
属性中获取 9223372036854775807
并从 PasswordNeverExpires
属性 中获取 False
?这似乎是一个矛盾。我错过了什么?还有其他情况 msDS-UserPasswordExpiryTimeComputed
也可能是 9223372036854775807
吗?谢谢。
documentation 列出了 几个 条件,其中 msDS-UserPasswordExpiryTimeComputed
returns 9223372036854775807
aka 0x7fffffffffffffff
aka [int64]::MaxValue
(TO
指给定的target object):
If any of the
ADS_UF_SMARTCARD_REQUIRED
,ADS_UF_DONT_EXPIRE_PASSWD
,ADS_UF_WORKSTATION_TRUST_ACCOUNT
,ADS_UF_SERVER_TRUST_ACCOUNT
,ADS_UF_INTERDOMAIN_TRUST_ACCOUNT
bits is set inTO!userAccountControl
, thenTO!msDS-UserPasswordExpiryTimeComputed
=0x7FFFFFFFFFFFFFFF
.
[...]
Else, ifEffective-MaximumPasswordAge = 0x8000000000000000
, thenTO!msDS-UserPasswordExpiryTimeComputed
=0x7FFFFFFFFFFFFFFF
(whereEffective-MaximumPasswordAge
is defined in [MS-SAMR] section 3.1.1.5).
在不知道所有细节的情况下,似乎 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
的测试合并到 -Filter
参数中。
顺便说一句:请注意,我使用了 string 而不是脚本块 ({ ... }
) 作为 -Filter
参数,因为使用脚本块是 best avoided.
我目前没有 DC 可以测试,但理论上这可以工作。
获取
Get-ADDefaultDomainPasswordPolicy -Identity Domain.com
域的密码策略
像这样获取用户的
passwordLastSet
属性:(Get-ADUser -Identity <UserName> -Properties *).PasswordlastSet
并根据域的文化转换为适当的[datetime]
对象:RefGet-Culture
。DateTime
格式可能会根据美国和英国等区域设置而改变。既然您有
passwordpolicy
(比如 60 天)和passwordlastset
日期,确定密码是否过期是简单的数学运算。
或者,在 2016 服务器上,您也可以使用类似的东西:
Search-ADAccount -AccountExpiring -TimeSpan 10.00:00:00