You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AD账户锁定邮件告警脚本间歇性运行故障求助

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)"
}

后续排查步骤

  1. 查看脚本生成的日志文件,定位是“未找到事件”还是“邮件发送失败”导致的间歇性问题;
  2. 确认任务计划的触发条件是当Security日志出现Event ID 4740时触发,而非定时触发;
  3. 检查两台DC的事件日志同步状态,确保锁定事件能正常同步到所有DC的Security日志中。

备注:内容来源于stack exchange,提问作者imaxt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:37:47