我可以为单个用户获取有效的“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”属性计算到期时间。但我想提取实际价值,因为年龄政策可能未知。任何帮助表示赞赏。
答案 0 :(得分:0)
msDS-UserPasswordExpiryTimeComputed
上的the spec:
msDS-UserPasswordExpiryTimeComputed属性存在于AD DS上,但不存在于AD LDS上。
此属性指示对象的密码将过期的时间。让
TO
成为读取属性msDS-UserPasswordExpiryTimeComputed
的对象。如果TO
不在域NC
中,则为TO!msDS-UserPasswordExpiryTimeComputed = null
。否则,让D
成为包含NC
的域TO
的根。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
(其中Effective-MaximumPasswordAge
在[MS-SAMR]第3.1.1.5节中定义。)否则,
TO!msDS-UserPasswordExpiryTimeComputed = TO!pwdLastSet + Effective-MaximumPasswordAge
(其中Effective-MaximumPasswordAge
在[MS-SAMR]第3.1.1.5节中定义。)
因此,msDS-UserPasswordExpiryTimeComputed
至少有两个魔术值:0x7FFFFFFFFFFFFFFF
和0
。它们似乎表示“从不”的含义略有不同(密码从未设置过,帐户密码设置为永不过期,不存在最大密码年龄)。我的猜测是,您查询的帐户属于上述类别之一。我很好奇msDS-UserPasswordExpiryTimeComputed
字段的原始值是什么。
如果您最近创建了密码期限政策,我想知道您是否可能需要强制用户重置密码才能使其生效?我认为这种行为是因为每个人的密码都会立即过期,但是需要多年才能考虑管理密码年龄政策。
答案 1 :(得分:0)
我必须在“*”之外定义属性才能使其正常工作。在这种情况下,仅靠星号是不够的。
Get-ADUser -Identity "$UserName" -Properties *,"msDS-UserPasswordExpiryTimeComputed"
我认为第二个例子只是在没有-SearchBase的情况下工作实际上一直在工作。正如Bacon Bits强调的那样,我只是查询了一小组用户,他们的到期时间设置为Never。所以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}