AD账户锁定邮件告警脚本间歇性运行故障求助
看起来你遇到了个挺棘手的间歇性问题——刚把域控制器迁移到Windows Server 2019 Datacenter核心版后,原本稳定运行的账户锁定告警PowerShell脚本开始时灵时不灵,两台DC的任务计划都启用了,但邮件就是没法每次都正常触发。我帮你梳理几个高概率的排查方向,再给你优化下脚本:
可能的故障原因及排查建议
事件日志读取权限或事件同步问题
核心版DC的默认权限配置可能和旧DC不同,任务计划的运行账户说不定没拿到读取Security日志的权限;另外两台DC都跑任务计划的话,若锁定事件只在其中一台DC生成,另一台的脚本读本地日志就找不到事件,直接报错终止。你可以先确认任务计划的运行账户是否有读取安全日志的权限,也可以临时用域管理员账户测试运行脚本,看是否稳定。脚本缺乏错误处理
原脚本里没有任何错误判断,如果某次运行时Get-EventLog没抓到最新的4740事件(比如事件还没写入日志、日志同步延迟),$Event就会是空值,后续调用$Event.Message会直接报错,脚本终止不发邮件。SMTP服务器连接稳定性问题
迁移DC后,新DC到SMTP服务器(our-adconnect.ourdomain.local)的网络链路可能存在间歇性阻塞,或者SMTP服务器的负载/权限配置有变化。可以在DC上用Test-Connection our-adconnect.ourdomain.local测试连通性,或者用telnet our-adconnect.ourdomain.local 25检查SMTP端口是否开放。
优化后的脚本(添加错误处理与运行日志)
我给你加了日志记录和错误捕获,方便你定位每次运行的问题点:
################################################################# # 自定义日志路径,可根据实际环境修改 $LogPath = "C:\Scripts\LockoutAlert.log" # 日志写入函数 function Write-Log { param([string]$Message) $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" Add-Content -Path $LogPath -Value "[$Timestamp] $Message" } try { Write-Log "账户锁定告警脚本开始执行" # 邮件配置变量 $MailSubject= "User Account locked out" $MailFrom="ourdomaincontroller1@ourdomain.com" $MailTo="ourITmailbox@ourdomain.com" # 获取最新锁定事件(强制抛出错误以便捕获) $Event = Get-EventLog -LogName Security -InstanceId 4740 -Newest 1 -ErrorAction Stop if (-not $Event) { Write-Log "未找到最新的账户锁定事件(Event ID 4740)" exit 0 } Write-Log "成功获取锁定事件:$($Event.TimeGenerated) - $($Event.Message)" # 组装邮件内容 $MailBody= $Event.Message + "`r`n`t" + $Event.TimeGenerated # 配置SMTP客户端 $SmtpClient = New-Object system.net.mail.smtpClient $SmtpClient.host = "our-adconnect.ourdomain.local" $SmtpClient.Timeout = 10000 # 设置10秒超时,避免脚本卡住 # 构建邮件对象 $MailMessage = New-Object system.net.mail.mailmessage $MailMessage.from = $MailFrom $MailMessage.To.add($MailTo) $MailMessage.IsBodyHtml = 0 $MailMessage.Subject = $MailSubject $MailMessage.Body = $MailBody # 发送邮件 $SmtpClient.Send($MailMessage) Write-Log "告警邮件已成功发送至 $MailTo" } catch { Write-Log "脚本执行出错:$($_.Exception.Message)" }
后续排查步骤
- 查看脚本生成的日志文件,定位是“未找到事件”还是“邮件发送失败”导致的间歇性问题;
- 确认任务计划的触发条件是当Security日志出现Event ID 4740时触发,而非定时触发;
- 检查两台DC的事件日志同步状态,确保锁定事件能正常同步到所有DC的Security日志中。
备注:内容来源于stack exchange,提问作者imaxt

