Powershell Active Directory中有关密码过期日期的值相互矛盾

Powershell Active Directory中有关密码过期日期的值相互矛盾,powershell,active-directory,windowsdomainaccount,Powershell,Active Directory,Windowsdomainaccount,我正在使用Powershell确定域帐户的密码过期日期。我已使用以下命令获取此信息: Get ADUser-Filter{SamAccountName-eq”“}-Properties“DisplayName”、“msDS UserPasswordExpiryTimeComputed” 然后,我使用以下方法将此值转换为有意义的日期: [datetime]::FromFileTime() 这适用于我使用的所有域,只有一个除外。在该域中,我得到一个值9223372036854775807,作为msD

我正在使用Powershell确定域帐户的密码过期日期。我已使用以下命令获取此信息:

Get ADUser-Filter{SamAccountName-eq”“}-Properties“DisplayName”、“msDS UserPasswordExpiryTimeComputed”

然后,我使用以下方法将此值转换为有意义的日期:

[datetime]::FromFileTime()

这适用于我使用的所有域,只有一个除外。在该域中,我得到一个值
9223372036854775807
,作为
msDS UserPasswordExpiryTimeComputed
。我无法使用
FromFileTime
函数将此数字转换为日期。它作为错误抛出。经过研究,我发现这个数字意味着密码不会过期。但是,我知道密码在这个域中确实会过期。此外,来自
Get-ADUser
cmdlet的
PasswordNeverExpires
属性显示为
False

如何从
msDS UserPasswordExpiryTimeComputed
属性获取
9223372036854775807
,如何从
PasswordNeverExpires
属性获取
False
?这似乎是一个矛盾。我错过了什么?当
msDS UserPasswordExpiryTimeComputed
也可以
9223372036854775807
时,是否存在其他情况?谢谢。

列出了几种条件,其中
msDS UserPasswordExpiryTimeComputed
返回
9223372036854775807
aka
0x7fffffffffffffffff
aka
[int64]::MaxValue
TO
指给定的目标对象):

如果需要任何
ADS\u UF\u智能卡
ADS\u UF\u密码不过期
ADS\u UF\u工作站信任账户
ADS\u服务器信任账户
ADS\u UF\u域间信任账户
位在
中设置为!userAccountControl
,然后
到!msDS UserPasswordExpiryTimeComputed
=
0x7fffffffffffff

[…]
否则,如果
有效MaximumPasswordAge=0x80000000000000
,则
到!msDS UserPasswordExpiryTimeComputed
=
0x7FFFFFFFFFFFFFFF
(其中,
有效最大密码在[MS-SAMR]第3.1.1.5节中定义)


在不了解所有详细信息的情况下,返回的
0x7fffffffffffffffffffffff
属性
msDS UserPasswordExpiryComputed
似乎表明实际上没有密码过期,原因有很多,其中只有一个原因是
PasswordNeverExpires
被设置为
$True

因此,您可以过滤掉这些值:

Get-ADUser -Filter "SamAccountName -eq '<username>'" `
           -Properties DisplayName, msDS-UserPasswordExpiryTimeComputed |                    #`
  Where { $_.msDS-UserPasswordExpiryTimeComputed -ne 0x7FFFFFFFFFFFFFFF } | ForEach {
      # ...
      $dt = [datetime]::FromFileTime($_.msDS-UserPasswordExpiryTimeComputed)
    }
Get ADUser-过滤器“SamAccountName-eq”`
-属性DisplayName,msDS UserPasswordExpiryTimeComputed|#`
其中{$\.msDS UserPasswordExpiryTimeComputed-ne 0x7fffffffffffff}ForEach{
# ...
$dt=[datetime]::FromFileTime($\ msDS.UserPasswordExpiryTimeComputed)
}
甚至可以将
0x7FFFFFFFFFFFFFFF
的测试合并到
-Filter
参数中


顺便说一句:请注意,我使用了字符串而不是脚本块(
{…}
)作为
-Filter
参数,因为使用脚本块是可行的。

我目前没有DC进行测试,但理论上这是可行的

  • 使用
    Get ADDefaultDomainPasswordPolicy-Identity domain.com

  • 获取如下用户的
    passwordLastSet
    属性:
    (Get ADUser-Identity-Properties*)。passwordLastSet
    并根据域的区域性转换为适当的
    [datetime]
    对象:
    Get Culture
    <代码>日期时间
  • 格式可能会根据美国和英国等地区的设置而更改

  • 现在您有了60天的
    passwordpolicy
    passwordlastset
    日期,确定密码是否过期是一个简单的数学问题

  • 或者,在2016服务器上,您也可以使用以下内容:

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

    顺便说一句:使用脚本块(
    {…}
    )作为
    -Filter
    参数是错误的。