Active Directory中与密码有效期有关的矛盾值

时间:2018-07-04 03:55:58

标签: powershell active-directory windowsdomainaccount

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

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

然后,我使用以下方法将该值隐式更改为有意义的日期:

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

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

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

2 个答案:

答案 0 :(得分:2)

documentation列出了几种条件,其中msDS-UserPasswordExpiryTimeComputed返回9223372036854775807 aka 0x7fffffffffffffff aka [int64]::MaxValueTO指给定的 t arget o bject):

  

如果在ADS_UF_SMARTCARD_REQUIRED中设置了ADS_UF_DONT_EXPIRE_PASSWDADS_UF_WORKSTATION_TRUST_ACCOUNTADS_UF_SERVER_TRUST_ACCOUNTADS_UF_INTERDOMAIN_TRUST_ACCOUNTTO!userAccountControl位中的任何一位,则{{1 }} = TO!msDS-UserPasswordExpiryTimeComputed
  [...]
  否则,如果0x7FFFFFFFFFFFFFFF,则Effective-MaximumPasswordAge = 0x8000000000000000 = TO!msDS-UserPasswordExpiryTimeComputed(其中0x7FFFFFFFFFFFFFFF在[MS-SAMR]第3.1.1.5节中定义)。


在不了解所有详细信息的情况下,似乎Effective-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参数中。

顺便说一句:请注意,我使用了 string 而不是脚本块(-Filter作为{ ... }参数,因为使用了脚本块是best avoided

答案 1 :(得分:1)

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

  1. 使用Get-ADDefaultDomainPasswordPolicy -Identity Domain.com

  2. 获取域的密码策略
  3. 获取用户passwordLastSet的{​​{1}}属性,如下所示:(Get-ADUser -Identity <UserName> -Properties *).PasswordlastSet并根据域的区域性:Ref {{1}转换为适当的[datetime]对象}。 Get-Culture格式可能会根据美国和英国等区域设置而更改。

  4. 现在您有DateTime个60天和passwordpolicy日期,这很简单,可以确定密码是否到期。

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

passwordlastset