2

我可以获得单个用户的有效“msDS-UserPasswordExpiryTimeComputed”属性:

(([DateTime]::FromFileTime((Get-ADUser $UserName -Properties "msDS-UserPasswordExpiryTimeComputed")."msDS-UserPasswordExpiryTimeComputed")))

但是我在定位一组特定用户时遇到了麻烦。我较大的脚本旨在从特定 OU 的帐户中提取各种 AD 用户属性并导出到 csv。除“PasswordExpiry”对象外,所有属性都按预期填充。

下面的示例为每个用户返回一个虚假的“PasswordExpiry”日期“12/31/1600”。“C:\UserList.txt”每行包含一个 sAMAccountNames。

$UserList=Get-Content "C:\UserList.txt"
ForEach ($UserName in $UserList) {Get-ADUser "$UserName" -Properties * | 
Select-Object sAMAccountName,whenCreated, `
@{Name="lastLogon";Expression={[DateTime]::FromFileTime($_.lastLogon)}}, `
@{Name="pwdLastSet";Expression={[DateTime]::FromFileTime($_.pwdLastSet)}}, `
@{Name="PasswordExpiry";Expression={[DateTime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, `
cannotChangePassword,passwordNeverExpires, `
@{Name="GroupMember";Expression={($_ | Select -ExpandProperty MemberOf) | Where {$_ -Like "*Desired.Group*"}}} |  
Export-Csv -Path "C:\UserInfo.csv" -Append -NoTypeInformation}

如果我想查询所有 AD 用户,这很有效:

Get-ADUser -Filter * –Properties sAMAccountName,"msDS-UserPasswordExpiryTimeComputed" |
Select-Object -Property sAMAccountName,@{Name="PasswordExpiry";Expression={[DateTime]::FromFileTime($_.“msDS-UserPasswordExpiryTimeComputed”)}}

但是,如果我将 [-SearchBase "OU=Users,DC=Domain,DC=local"] 参数添加到 Get-ADUser,我会得到“PasswordExpiry”的空输出。我想我可以尝试通过一些后期处理来解析整个输出。似乎触摸的次数超出了我应该触摸的次数。

我知道我可以根据“pwdLastSet”属性计算过期时间。但我想提取实际值,因为年龄政策可能是未知的。任何帮助表示赞赏。

4

2 回答 2

1

除了“*”之外,我还必须定义该属性才能使其工作。在这种情况下,显然只有星号是不够的。

Get-ADUser -Identity "$UserName" -Properties *,"msDS-UserPasswordExpiryTimeComputed"

我认为只有在没有 -SearchBase 的情况下才能工作的第二个例子实际上一直在工作。正如 Bacon Bits 强调的那样,我只查询了一小部分过期设置为从不的用户。所以 null 是一个有效的输出。

这不是原始脚本的问题。无论如何,它都会返回“12/31/1600”。如上所述,我必须添加附加属性才能获得正确的值。现在这些都很好。

$UserList=Get-Content "C:\UserList.txt"
ForEach ($UserName in $UserList) {Get-ADUser "$UserName" -Properties *,"msDS-UserPasswordExpiryTimeComputed" | 
Select-Object sAMAccountName,whenCreated, `
@{Name="lastLogon";Expression={[DateTime]::FromFileTime($_.lastLogon)}}, `
@{Name="pwdLastSet";Expression={[DateTime]::FromFileTime($_.pwdLastSet)}}, `
@{Name="PasswordExpiry";Expression={[DateTime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, `
cannotChangePassword,passwordNeverExpires, `
@{Name="GroupMember";Expression={($_ | Select -ExpandProperty MemberOf) | Where {$_ -Like "*Desired.Group*"}}} |  
Export-Csv -Path "C:\UserInfo.csv" -Append -NoTypeInformation}

Get-ADUser -Filter * -SearchBase "OU=Users,DC=Domain,DC=local" –Properties sAMAccountName,"msDS-UserPasswordExpiryTimeComputed" |
Select-Object -Property sAMAccountName,@{Name="PasswordExpiry";Expression={[DateTime]::FromFileTime($_.“msDS-UserPasswordExpiryTimeComputed”)}}

编辑:现在按照 Bacon Bits 的建议执行此操作:

$ListOfOUs="OU=Users01,DC=Domain,DC=local","OU=Users02,DC=Domain,DC=local","OU=Users03,DC=Domain,DC=local"
$ListOfOUs | ForEach {Get-ADUser -Filter * -SearchBase $_ -Properties sAMAccountName,whenCreated,lastLogon, `
pwdLastSet,"msDS-UserPasswordExpiryTimeComputed",cannotChangePassword,passwordNeverExpires,MemberOf | 
Select-Object sAMAccountName,whenCreated, `
@{Name="lastLogon";Expression={[DateTime]::FromFileTime($_.lastLogon)}}, `
@{Name="pwdLastSet";Expression={[DateTime]::FromFileTime($_.pwdLastSet)}}, `
@{Name="PasswordExpiry";Expression={[DateTime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, `
cannotChangePassword,passwordNeverExpires, `
@{Name="GroupMember";Expression={($_ | Select -ExpandProperty MemberOf) | Where {$_ -Like "*Desired.Group*"}}} |  
Export-Csv -Path "C:\UserInfo.csv" -Append -NoTypeInformation}
于 2017-10-29T09:09:38.877 回答
1

根据规范msDS-UserPasswordExpiryTimeComputed:_

msDS-UserPasswordExpiryTimeComputed 属性存在于 AD DS 上,但不存在于 AD LDS 上。

该属性表示对象的密码到期的时间。让是读取TO属性的对象。msDS-UserPasswordExpiryTimeComputed如果TO不在域中NC,则TO!msDS-UserPasswordExpiryTimeComputed = null. 否则,设为包含D的域的根。按照以下指定的顺序应用以下规则来确定 的值:NCTODCTO!msDS-UserPasswordExpiryTimeComputed

  • 如果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!userAccountControl, 那么TO!msDS-UserPasswordExpiryTimeComputed = 0x7FFFFFFFFFFFFFFF.

  • 否则,如果TO!pwdLastSet = nullTO!pwdLastSet = 0,则TO!msDS-UserPasswordExpiryTimeComputed = 0

  • 否则,如果Effective-MaximumPasswordAge = 0x8000000000000000,则TO!msDS-UserPasswordExpiryTimeComputed = 0x7FFFFFFFFFFFFFFFEffective-MaximumPasswordAge在 [MS-SAMR] 第 3.1.1.5 节中定义)。

否则,TO!msDS-UserPasswordExpiryTimeComputed = TO!pwdLastSet + Effective-MaximumPasswordAgeEffective-MaximumPasswordAge在 [MS-SAMR] 第 3.1.1.5 节中定义)。

msDS-UserPasswordExpiryTimeComputed因此, :0x7FFFFFFFFFFFFFFF和.至少有两个神奇的值0。它们似乎都代表了“从不”的略微不同的含义(从未设置过密码,帐户密码设置为永不过期,不存在最大密码使用期限)。我的猜测是您查询的帐户属于上述类别之一。我很好奇该msDS-UserPasswordExpiryTimeComputed字段的原始值是什么。

如果您最近创建了密码年龄策略,我想知道您是否可能需要强制用户重置密码才能使其生效?我认为这种行为是每个人的密码都会立即过期,但我已经多年没有考虑管理密码期限政策了。

于 2017-10-28T23:46:19.967 回答