每日逐个禁用AD账户脚本优化:实现断点续跑与邮件通知
优化PowerShell脚本实现AD账户每日禁用的断点续跑功能
原脚本的核心问题是缺乏持久化的进度记录机制,且依赖Start-Sleep维持每日执行逻辑,导致计划任务重启后无法从断点继续。以下是优化后的实现方案:
优化思路
- 新增进度记录文件持久化已处理的账户列表
- 每次脚本启动时,对比原始用户列表与已处理列表,定位第一个未处理的账户
- 去掉
Start-Sleep,由Windows计划任务的每日触发逻辑替代脚本内的等待 - 无论账户禁用成功或失败,均标记该账户为已处理,避免重复执行
优化后的完整脚本
# 配置参数 $userListPath = "C:\userlist.txt" $processedListPath = "C:\processed_users.txt" $emailFrom = "your@email.com" $emailTo = "recipient@email.com" $smtpServer = "smtp.yourserver.com" # 读取原始用户列表与已处理列表 $allUsers = Get-Content -Path $userListPath -ErrorAction Stop $processedUsers = if (Test-Path -Path $processedListPath) { Get-Content -Path $processedListPath } else { @() } # 筛选出第一个未处理的用户 $nextUser = $allUsers | Where-Object { $_ -notin $processedUsers } | Select-Object -First 1 if ($nextUser) { try { # 禁用AD账户 Disable-ADAccount -Identity $nextUser -ErrorAction Stop # 发送成功通知 Send-MailMessage -From $emailFrom -To $emailTo ` -Subject "AD账户禁用成功" ` -Body "账户 $nextUser 已成功禁用。" ` -SmtpServer $smtpServer -ErrorAction Stop } catch { # 发送错误通知 Send-MailMessage -From $emailFrom -To $emailTo ` -Subject "AD账户禁用失败" ` -Body "禁用账户 $nextUser 时出错:`n$_" ` -SmtpServer $smtpServer -ErrorAction SilentlyContinue } finally { # 将当前用户写入已处理列表(无论成功失败都记录) Add-Content -Path $processedListPath -Value $nextUser -ErrorAction Stop } } else { # 所有用户已处理完成,发送通知 Send-MailMessage -From $emailFrom -To $emailTo ` -Subject "AD账户禁用任务完成" ` -Body "所有待处理的AD账户已全部处理完毕。" ` -SmtpServer $smtpServer -ErrorAction Stop }
关键部分说明
进度记录逻辑:
- 脚本启动时检查
processed_users.txt是否存在,不存在则初始化空列表 - 通过
Where-Object { $_ -notin $processedUsers }筛选未处理账户,取第一个执行 finally块确保无论禁用操作成功或失败,当前用户都会被写入已处理文件,避免重复执行
- 脚本启动时检查
计划任务适配:
- 移除原脚本中的
Start-Sleep,脚本每次仅处理一个账户后退出 - 保持Windows计划任务的每日凌晨12:01触发配置即可实现每日处理一个账户的需求
- 移除原脚本中的
异常处理增强:
- 对
Disable-ADAccount和Send-MailMessage添加-ErrorAction Stop确保异常能被捕获 - 错误邮件发送时使用
-ErrorAction SilentlyContinue避免因邮件发送失败导致进度记录未执行
- 对
内容的提问来源于stack exchange,提问作者Senior Systems Engineer
相关产品推荐
相关产品推荐

