我可以为单个用户获得一个有效的"msDS-UserPasswordExpiryTimeComputed“属性:
(([DateTime]::FromFileTime((Get-ADUser $UserName -Properties "msDS-UserPasswordExpiryTimeComputed")."msDS-UserPasswordExpiryTimeComputed")))
但我很难瞄准一群特定的用户。我的更大的脚本旨在从帐户中提取各种AD用户属性,特别是OU,并导出到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,就会得到"PasswordExpiry”的空输出。我想我可以尝试使用一些后置处理来解析整个输出。好像摸得比我不该碰的还多。
我知道我可以根据"pwdLastSet“属性计算到期时间。但我想提取实际值,因为年龄政策可能是未知的。任何帮助都是非常感谢的。
发布于 2017-10-28 23:46:19
Per 规格 on msDS-UserPasswordExpiryTimeComputed
属性存在于msDS,而不存在于AD上。 此属性指示对象密码过期的时间。让
TO
是读取属性msDS-UserPasswordExpiryTimeComputed
的对象。如果TO
不在域NC
中,那么TO!msDS-UserPasswordExpiryTimeComputed = null
。否则,让D
成为包含TO
的域NC
的根。DC
按照下面指定的顺序应用以下规则来确定TO!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 = null
,或者TO!pwdLastSet = 0
,那么TO!msDS-UserPasswordExpiryTimeComputed = 0
。Effective-MaximumPasswordAge = 0x8000000000000000
,那么TO!msDS-UserPasswordExpiryTimeComputed = 0x7FFFFFFFFFFFFFFF
(在MS第3.1.1.5节中定义了Effective-MaximumPasswordAge
)。否则,TO!msDS-UserPasswordExpiryTimeComputed = TO!pwdLastSet + Effective-MaximumPasswordAge
(在MS 3.1.1.5节中定义了Effective-MaximumPasswordAge
)。
因此,msDS-UserPasswordExpiryTimeComputed
至少有两个神奇的值:0x7FFFFFFFFFFFFFFF
和0
。它们似乎都代表了“从不”的含义略有不同(密码从未设置,帐户密码设置为永不过期,不存在最大密码年龄)。我的猜测是,您查询的帐户属于上述类别之一。我会好奇msDS-UserPasswordExpiryTimeComputed
字段的原始值是什么。
如果您最近创建了密码年龄策略,我想知道您是否需要强制用户重置密码才能生效?我以为每个人的密码都会立即过期,但我已经好几年没有考虑管理密码年龄政策了。
发布于 2017-10-29 09:09:38
除了"*“之外,我还必须定义该属性以使其正常工作。显然,在这种情况下,星号是不够的。
Get-ADUser -Identity "$UserName" -Properties *,"msDS-UserPasswordExpiryTimeComputed"
我认为只有在没有-SearchBase的情况下才能工作的第二个例子实际上一直有效。正如培根比特所强调的那样,我只是在查询一小部分用户,这些用户的过期设置为“永远不会”。所以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”)}}
编辑:现在按照培根比特建议执行此操作:
$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}
发布于 2022-08-31 04:40:56
下面是一个运行在特定OU上的脚本,它获取用户名、电子邮件、dn、密码最后一次设置、过期计算以及密码中的天数将过期。
跳过任何已Pass的用户从未过期启用。
也跳过禁用用户。
这可以使用mentioned规范中提到的逻辑来改进(详见其他答案)
Get-ADUser -SearchBase "OU=Users,DC=domain,DC=org" `
-filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} `
–Properties "SamAccountName","mail","distinguishedName","pwdLastSet","msDS-UserPasswordExpiryTimeComputed","msDS-UserPasswordExpiryTimeComputed" |
Select-Object -Property "SamAccountName","mail","distinguishedName",
@{Name="Password Last Set"; Expression={[datetime]::FromFileTime($_."pwdLastSet")}},
@{Name="Password Expiry Date"; Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}},
@{Name="Password Expired"; Expression=`
{
if(([datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") - (GET-DATE)).Days -le 0)
{
if([datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed").Year -eq 1600)
{
'Password Never Set'
}
else
{
'Yes'
}
}
else
{
'No'
}
}
} |
Export-CSV "C:\temp\PasswordExpirationReport.csv" -NoTypeInformation -Encoding UTF8
https://stackoverflow.com/questions/46995282
复制相似问题