PowerShell可通过ActiveDirectory模块查询7天内过期的启用用户密码,排除永不过期等特殊情况,并支持邮件提醒、日志记录及定时任务自动化部署。
获取即将过期的域用户密码列表
powershell 通过 active directory 模块(需安装 rsat-ad-powershell)可查询用户密码最后设置时间与最大密码年龄策略,从而计算剩余有效期。执行前确保以具有域读取权限的账户运行,并导入模块:
Import-Module ActiveDirectory
以下命令列出密码将在未来 7 天内过期的启用用户(排除密码永不过期、密码不须更改等特殊情况):
Get-ADUser -Filter {(Enabled -eq $true) -and (PasswordNeverExpires -eq $false) -and (PasswordNotRequired -eq $false)} -Properties "DisplayName","Mail","PasswordLastSet","msDS-UserPasswordExpiryTimeComputed" | ForEach-Object {
$expTime = [datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")
$daysLeft = ($expTime - (Get-Date)).Days
if ($daysLeft -ge 0 -and $daysLeft -le 7) {
[PSCustomObject]@{
DisplayName = $_.DisplayName
SamAccountName = $_.SamAccountName
Email = $_.Mail
PasswordExpiry = $expTime
DaysRemaining = $daysLeft
}
}
} | Sort-Object DaysRemaining | Format-Table -AutoSize
自动发送邮件提醒给用户和管理员
将上一步结果导出为对象后,可逐条调用 Send-MailMessage 或更推荐的 Send-MgUserMail(配合 Microsoft Graph API),但若内网环境常用 SMTP,可配置本地邮件服务器发送:
- 确保 PowerShell 可访问 SMTP 服务(如 Exchange Server 或匿名 relay)
- 为每位用户构造个性化邮件正文,包含到期日期、自助修改密码方式(如 https://passwordreset.microsoft.com)
- 同时抄送 IT 管理员邮箱,便于跟踪高风险账户
- 添加日志记录:将已发送提醒写入 CSV 或 Event Log,避免重复触发
部署为定时任务实现自动化预警
将脚本保存为 Alert-ExpiringPasswords.ps1,并配置 Windows 计划任务每日凌晨运行:
- 使用 Register-ScheduledTask 或 GUI 创建任务,运行身份建议为专用域服务账户(有 AD 读取权限但无写权限)
- 脚本开头添加执行策略绕过(仅限可信环境):Set-ExecutionPolicy Bypass -Scope Process -Force
- 输出结果可重定向到日志文件,例如:.\Alert-ExpiringPasswords.ps1 >> C:\Logs\pwdalert.log
- 建议首次手动运行并验证输出,再启用自动调度
注意事项与常见问题
实际运行中需注意几个关键点:
- 密码策略继承:用户所属 OU 若应用了不同“最大密码年龄”,需结合 Get-ADDefaultDomainPasswordPolicy 和 Get-ADOrganizationalUnit + GPO 查询确认
- 属性延迟更新:“msDS-UserPasswordExpiryTimeComputed” 是只读计算属性,依赖域控制器同步,新设密码后可能需数分钟才刷新
- 空邮箱处理:若 Mail 属性为空,可 fallback 到 UserPrincipalName 或跳过邮件发送,改用 Teams/Slack 通知
- 跨林环境:多域森林中需指定 -Server 参数连接对应域控制器,或使用全局编录端口

















