3

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

Get-ADUser -Filter {SamAccountName -eq "<username>"} -Properties "DisplayName" , "msDS-UserPasswordExpiryTimeComputed"

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

[datetime]::FromFileTime(<computed filetime from above command>)

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

如何9223372036854775807msDS-UserPasswordExpiryTimeComputed属性中获取并获取False从属性中获取PasswordNeverExpires?这似乎是一个矛盾。我错过了什么?还有其他情况msDS-UserPasswordExpiryTimeComputed也可以9223372036854775807吗?谢谢。

4

2 回答 2

3

文档列出了几个条件,其中返回msDS-UserPasswordExpiryTimeComputedaka 9223372036854775807aka 0x7fffffffffffffff[int64]::MaxValueTO给定的t arget o bject ):

如果在中设置了ADS_UF_SMARTCARD_REQUIRED, ADS_UF_DONT_EXPIRE_PASSWD, ADS_UF_WORKSTATION_TRUST_ACCOUNT, ADS_UF_SERVER_TRUST_ACCOUNT,中的任何一个,则= 。 [...] 否则,如果,则= (在 [MS-SAMR] 第 3.1.1.5 节中定义)。ADS_UF_INTERDOMAIN_TRUST_ACCOUNTTO!userAccountControlTO!msDS-UserPasswordExpiryTimeComputed0x7FFFFFFFFFFFFFFF

Effective-MaximumPasswordAge = 0x8000000000000000TO!msDS-UserPasswordExpiryTimeComputed0x7FFFFFFFFFFFFFFFEffective-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合并到-Filter论证中。

顺便说一句:请注意,我使用字符串而不是脚本块 ( { ... }) 作为参数,因为最好避免-Filter使用脚本块。

于 2018-07-04T04:35:01.993 回答
1

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

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

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

  3. 既然您有了passwordpolicy60 天和passwordlastset日期,那么确定密码是否过期就很简单了。

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

Search-ADAccount -AccountExpiring -TimeSpan 10.00:00:00
于 2018-07-04T06:45:41.097 回答