【问题标题】:Contradictory values from Active Directory regarding password expiry date来自 Active Directory 的关于密码到期日期的矛盾值
【发布时间】:2018-07-04 03:55:57
【问题描述】:

我正在使用 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 吗?谢谢。

【问题讨论】:

  • 顺便说一句:使用脚本块 ({ ... }) 作为 -Filter 参数是 best avoided。

标签: powershell active-directory windowsdomainaccount


【解决方案1】:

documentation 列出了几个条件,其中msDS-UserPasswordExpiryTimeComputed 返回9223372036854775807 又名0x7fffffffffffffff 又名[int64]::MaxValue(TO 指的是给定的t arget object):

如果在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 在[MS-SAMR] 第3.1.1.5 节中定义)。


在不知道所有细节的情况下,似乎返回0x7FFFFFFFFFFFFFFF的msDS-UserPasswordExpiryTimeComputed属性表明实际上没有密码过期,由于各种原因,只有一个 em> 其中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 .

【讨论】:

    【解决方案2】:

    我目前没有要测试的 DC,但理论上这可以工作。

    1. 使用Get-ADDefaultDomainPasswordPolicy -Identity Domain.com获取域的密码策略

    2. 像这样获取用户的passwordLastSet 属性:(Get-ADUser -Identity &lt;UserName&gt; -Properties *).PasswordlastSet 并根据域的文化转换为适当的[datetime] 对象:RefGet-Culture。 DateTime 格式可能会根据美国和英国等地区设置而变化。

    3. 现在您有了 60 天的 passwordpolicy 和 passwordlastset 日期,确定密码是否过期是简单的数学运算。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多