使用 PowerShell 查找密码已过期的 Active Directory 用户。您负责管理活动目录(AD)环境中的密码吗?一个关键的任务是识别密码已过期的用户,因为这些用户将无法登录他们的帐户,直到他们重置密码。本文将向您展示如何有效地使用 PowerShell 查找密码已过期的 Active Directory 用户。
我们开始我们关于使用 PowerShell 查找密码已过期的 Active Directory 用户的文章博客。
使用 PowerShell 查找密码已过期的 AD 用户
先决条件
如果我们计划遵循本文,我们将需要以下内容:
- A Windows computer joined to an Active Directory domain.
- 已安装计算机上的ActiveDirectory模块。
- 计算机还必须至少安装Windows PowerShell 5.1或更高版本。
在Active Directory中查找用户
在重置用户密码之前,我们必须先找到账户。因此,我们的第一步应该是确定是否存在保留。为此,请使用Get-ADUser cmdlet,并将Identity参数设置为账户名称。
Identity参数接受四个标识符之一:区别名称(DN)、GUID(objectGUID)、安全标识(objectSID)或SAM账户名称(SAMAccountName)。
Get-ADUser -Identity
该命令返回了用户属性,如下面的屏幕截图所示,确认账户存在且用户名正确:
在AD中查找密码已过期的用户
我们可以通过将属性msDS-UserPasswordExpiryTimeComputed附加到Get-ADUser命令来快速获取单个用户的密码过期日期:
Get-ADUser -Identity USERNAME -Properties 'msDS-UserPasswordExpiryTimeComputed'
但是这行代码会导致人类无法阅读的输出,所以我们需要添加以下行将结果转换为可读格式。为了添加以下行,我们将在新的PowerShell 管道上使用Select-Object-Property命令:
Select-Object -Property {[datetime]::FromFileTime($_.”msDS-UserPasswordExpiryTimeComputed”)}
使用正确的过滤器运行相同的属性msDS-UserPasswordExpiryTimeComputed,我们得到一个Active Directory账户列表和它们的密码到期时间:
Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" |
Select-Object -Property "Displayname",@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}

我们通过将用户列表导出到以后可以使用的文本文件来改进上述脚本。为此,我们可以使用Out-File命令将输出发送到文本文件:
Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" |
Select-Object -Property "GivenName" |
Out-File -FilePath .\userslist.txt
上面的脚本生成一个名为 userslist.txt 的文件,我们以后可以使用。我们还从输出中省略了 ExpiryDate 属性,因为我们只需要已过期的帐户的用户ID。我们将此列表用于后面讨论的大规模修复。
还阅读部署活动目录密码报告
重置活动目录用户密码
现在我们已经学会了如何使用 Get-ADUser 来验证用户帐户,我们知道结果是有效的,并且用户ID存在。我们现在必须使用 Set-ADAccountPassword 命令来重置用户的密码。
Set-ADAccountPassword 命令在我们提供旧密码的情况下更改用户的 密码。如果我们没有旧密码,则该命令使用 Reset 参数进行重置。
新生成的随机密码是一个具有五个非字母数字字符的14字符随机密码。要执行,请打开一个 PowerShell 窗口,复制代码,将其粘贴到 PowerShell 中,然后按 Enter:
$username = USERNAME
Add-Type -AssemblyName 'System.Web'
$randomPassword = [System.Web.Security.Membership]::GeneratePassword(14, 5)
$newPassword = $randomPassword | ConvertTo-SecureString -AsPlainText -Force
Set-ADAccountPassword -Identity $username -NewPassword $newPassword -Reset |
Set-ADUser -ChangePasswordAtLogon true
$randomPassword
- 第1行:指定要重置密码的用户名。确保将USERNAME字符串替换为实际用户ID。
- 第2行:导入System.Web .NET程序集对象类。
- 第3行:生成一个14个字符长且包含五个非字母数字字符的随机密码。
- 第4行:将明文密码转换为安全字符串密码对象。
- 第5行:简化密码重置操作。
- 第6行:强制AD帐户在下次登录时更改密码。
- 第7行:在控制台显示新密码。然而,出于安全考虑,我们不建议这样做。第6行负责密码更改以符合用户的喜好,并被认为是该过程的最佳实践。
改善您的Active Directory安全性与Azure AD
免费试用我们,访问所有功能。-提供200多个AD报告模板。轻松定制您自己的AD报告。
编写活动目录密码重置工具
我们现在有一个脚本,用于重置用户的密码。下一步是将我们的脚本制作成一个工具。一个可重复使用的工具以最少的用户手动操作执行相同的动作。
在构建工具时,一个关键的方面是运行工具的人不应该每次都需要编辑代码。但不幸的是,我们的代码仍然需要用户编辑$username变量。
与其允许我们的工具用户手动更改值,为什么不编写一个接受参数的脚本呢?为此,请按照以下步骤操作:
- 打开Windows PowerShell ISE。
- 创建一个新的PowerShell文件,并将文件命名为Reset-ADPassword.ps1。将脚本保存在我们喜欢的位置。本文将文件保存在C:\PS\scripts文件夹中。
- 在保存脚本之前,请将下面的代码复制并粘贴到我们的脚本编辑器中。
param (
$username
)
if (-not($username)) {
Write-Host "Username not found. Exiting script"
return $null
}
try {
$null = Get-ADUser -Identity $username -ErrorAction Stop
} catch {
Write-Host $_.Exception.Message
return $null
}
$randomPassword = [System.Web.Security.Membership]::GeneratePassword(14, 5)
$newPassword = $randomPassword | ConvertTo-SecureString -AsPlainText -Force
try {
Set-ADAccountPassword -Identity $username -NewPassword $newPassword -Reset -ErrorAction Stop
Set-ADuser -Identity $username -ChangePasswordAtLogon $true
[pscustomobject]@{
Username = $username
NewPassword = $randomPassword
}
} catch {
Write-Host "There was an error performing the password reset. Please find additional information below."
Write-host $_.Exception.Message
return $null
}
- 第1行:添加了一个名为 用户名的参数。
- 第5行:检查用户是否提供了用户名值。如果条件满足,如果块还会显示一条消息并退出脚本。
- 第10行:检查用户名是否有效。
- 第12行:验证用户名是否无效。显示一条消息并停止脚本执行。
- 第17行:生成一个14个字符长的随机密码,其中包含五个非字母数字字符。
- 第18行:将纯文本密码转换为安全字符串密码对象。
- 第20行:便于重置密码。
- 第22行:强制AD账户在下次登录时更改密码。
- 第24行:在控制台显示新密码。然而,我们不建议这样做,因为安全性。第6行将负责将密码更改为用户喜欢的内容,并被认为是此过程的最佳实践。
- 第28行:如果重置失败,则显示错误消息。
执行AD密码重置工具的示例
A PowerShell console pane is already available if we use Windows PowerShell ISE. If not, we should launch a separate PowerShell session. Change the current working directory to the destination folder where the script was saved, such as Set-Location C:\PS\Scripts.
重置单个用户的密码
假设我们需要重置一个用户的密码。首先,运行Active Directory密码重置工具并指定要针对的用户名。例如,要重置单个用户的密码,请运行以下脚本:
.\Reset-ADPassword.ps1 -username USERNAME
结果,脚本重置了密码并在屏幕上显示了它。例如,此输出将新密码发送给受影响的用户:
重置多个用户的密码
幸运的是,我们可以使用数组和foreach循环在PowerShell中遍历列表。此外,PowerShell中的ForEach-Object cmdlet允许我们同时处理多个项目。此cmdlet允许我们将各种项目通过管道传递。
要重置多个用户的密码,请创建一个包含两个或更多用户名的数组。然后,数组项通过管道传递,在管道中,ForEach-Object PowerShell命令对每个用户名运行密码重置工具。
@('user1', 'user2') | ForEach-Object {.\Reset-ADPassword.ps1 -username $PSItem}
但是,如果我们需要修复超过两个用户帐户,我们可以改进这一点。记得我们之前生成的文本文件吗?我们将在本节中使用它。
我们必须读取包含用户帐户的文本文件,并对每个帐户运行AD密码重置工具。为此,请使用Get-Content cmdlet 将文本文件的内容导入到 PowerShell。之后,脚本将数据发送到管道并对每个帐户运行AD密码重置脚本。
Get-Content .\userslist.txt | ForEach-Object {.\Reset-ADPassword.ps1 -username $PSItem}
执行上述代码段后,我们将在单个运行时重置多个用户密码。
感谢阅读文章博客《使用 PowerShell 查找具有过期密码的活动目录用户》。我们现在将总结它。
找到具有过期密码的AD用户 PowerShell 结论
总之,使用 PowerShell 查找具有已过期密码的 Active Directory 用户是一个直接的过程,可以节省我们的时间和精力。使用 Get-ADUser cmdlet 并过滤具有已过期密码的用户,您可以快速识别并针对特定用户进行密码重置或到期通知。对于拥有大量用户的组织来说,此命令非常方便,因为它使您能够主动管理密码到期并减少安全漏洞的风险。在我们的博客的 Active Directory 部分以及 PowerShell 部分阅读更多内容。
在这里查看我们的博客的 Active Directory 部分以及 PowerShell 部分 这里。
Source:
https://infrasos.com/find-active-directory-users-with-expired-password-powershell/