来自 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]::MaxValueTO指给定的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 可以测试,但理论上这可以工作。

  1. 获取Get-ADDefaultDomainPasswordPolicy -Identity Domain.com

  2. 域的密码策略
  3. 像这样获取用户的 passwordLastSet 属性:(Get-ADUser -Identity <UserName> -Properties *).PasswordlastSet 并根据域的文化转换为适当的 [datetime] 对象:Ref Get-CultureDateTime 格式可能会根据美国和英国等区域设置而改变。

  4. 既然您有 passwordpolicy(比如 60 天)和 passwordlastset 日期,确定密码是否过期是简单的数学运算。

或者,在 2016 服务器上,您也可以使用类似的东西:

Search-ADAccount -AccountExpiring -TimeSpan 10.00:00:00