首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取-ADUser密码到期的用户在特定的OU。

获取-ADUser密码到期的用户在特定的OU。
EN

Stack Overflow用户
提问于 2017-10-28 22:53:19
回答 3查看 4K关注 0票数 2

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

代码语言:javascript
运行
复制
(([DateTime]::FromFileTime((Get-ADUser $UserName -Properties "msDS-UserPasswordExpiryTimeComputed")."msDS-UserPasswordExpiryTimeComputed")))

但我很难瞄准一群特定的用户。我的更大的脚本旨在从帐户中提取各种AD用户属性,特别是OU,并导出到csv。除了"PasswordExpiry“对象之外,所有属性都按预期填充。

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

代码语言:javascript
运行
复制
$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用户,这是可行的:

代码语言:javascript
运行
复制
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“属性计算到期时间。但我想提取实际值,因为年龄政策可能是未知的。任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

发布于 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_REQUIREDADS_UF_DONT_EXPIRE_PASSWDADS_UF_WORKSTATION_TRUST_ACCOUNTADS_UF_SERVER_TRUST_ACCOUNTADS_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至少有两个神奇的值:0x7FFFFFFFFFFFFFFF0。它们似乎都代表了“从不”的含义略有不同(密码从未设置,帐户密码设置为永不过期,不存在最大密码年龄)。我的猜测是,您查询的帐户属于上述类别之一。我会好奇msDS-UserPasswordExpiryTimeComputed字段的原始值是什么。

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

票数 1
EN

Stack Overflow用户

发布于 2017-10-29 09:09:38

除了"*“之外,我还必须定义该属性以使其正常工作。显然,在这种情况下,星号是不够的。

代码语言:javascript
运行
复制
Get-ADUser -Identity "$UserName" -Properties *,"msDS-UserPasswordExpiryTimeComputed"

我认为只有在没有-SearchBase的情况下才能工作的第二个例子实际上一直有效。正如培根比特所强调的那样,我只是在查询一小部分用户,这些用户的过期设置为“永远不会”。所以null是一个有效的输出。

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

代码语言:javascript
运行
复制
$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}
代码语言:javascript
运行
复制
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”)}}

编辑:现在按照培根比特建议执行此操作:

代码语言:javascript
运行
复制
$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}
票数 1
EN

Stack Overflow用户

发布于 2022-08-31 04:40:56

下面是一个运行在特定OU上的脚本,它获取用户名、电子邮件、dn、密码最后一次设置、过期计算以及密码中的天数将过期。

跳过任何已Pass的用户从未过期启用。

也跳过禁用用户。

这可以使用mentioned规范中提到的逻辑来改进(详见其他答案)

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46995282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档