如何使用Powershell实现域控制器证书到期前24小时邮件提醒
PowerShell 域控制器证书到期24小时内邮件通知实现方案
完整实现代码
# 1. 查询本地计算机个人存储区的证书,计算剩余有效天数 $expiringCerts = Get-ChildItem Cert:\LocalMachine\My ` | Select-Object @{N='StartDate';E={$_.NotBefore}}, @{N='EndDate';E={$_.NotAfter}}, @{N='DaysRemaining';E={($_.NotAfter - (Get-Date)).Days}}, @{N='Thumbprint';E={$_.Thumbprint}}, @{N='Subject';E={$_.Subject}} ` | Where-Object { $_.DaysRemaining -lt 1 -and $_.DaysRemaining -ge -7 } # 过滤到期不足24小时,以及过期7天内的证书,可自行调整阈值 # 2. 存在即将到期/已过期证书时发送邮件 if ($expiringCerts.Count -gt 0) { # 组装邮件正文 $mailBody = @" <p>以下域控制器证书即将在24小时内到期或已过期,请及时处理:</p> <table border="1" cellpadding="5" cellspacing="0"> <tr> <th>证书主题</th> <th>指纹</th> <th>生效日期</th> <th>到期日期</th> <th>剩余有效天数</th> </tr> "@ foreach ($cert in $expiringCerts) { $mailBody += "<tr> <td>$($cert.Subject)</td> <td>$($cert.Thumbprint)</td> <td>$($cert.StartDate.ToString('yyyy-MM-dd HH:mm:ss'))</td> <td>$($cert.EndDate.ToString('yyyy-MM-dd HH:mm:ss'))</td> <td>$($cert.DaysRemaining)</td> </tr>" } $mailBody += "</table>" # 邮件配置,以下参数请根据实际环境修改 $smtpServer = "你的SMTP服务器地址" # 例如域内Exchange服务器地址、企业SMTP网关地址 $smtpPort = 25 # 常用端口:不加密25、SSL加密465、TLS加密587 $enableSSL = $false # SMTP要求加密则设为$true $mailFrom = "证书监控通知 <alert@yourdomain.com>" # 发件人地址 $mailTo = @("管理员1 <admin1@yourdomain.com>", "管理员2 <admin2@yourdomain.com>") # 收件人地址,多个用逗号分隔 $mailSubject = "[告警] 域控制器证书即将到期,请及时处理" # 发送邮件,如果SMTP需要身份验证,可新增 -Credential 参数传入账号密码凭据 Send-MailMessage -From $mailFrom ` -To $mailTo ` -Subject $mailSubject ` -Body $mailBody ` -BodyAsHtml ` -SmtpServer $smtpServer ` -Port $smtpPort ` -UseSsl:$enableSSL }
配置与使用说明
- SMTP服务器适配:如果使用域内Exchange服务,需提前配置接收连接器允许当前域控制器的IP地址匿名发送邮件,避免邮件被拦截
- 告警阈值调整:代码中
Where-Object的过滤条件可按需修改,比如要提前7天收到通知,可把$_.DaysRemaining -lt 1改为$_.DaysRemaining -lt 7 - 自动执行配置:可将该脚本添加到域控制器的计划任务中,设置每天定时执行1次,实现自动监控告警
- 身份验证配置:如果SMTP服务要求账号验证,可在代码中添加凭据获取逻辑:
$cred = Get-Credential,然后在Send-MailMessage命令中添加参数-Credential $cred - 测试方法:可以先修改过滤条件为
$_.DaysRemaining -lt 30,确认有符合条件的证书时脚本可以正常发送邮件,再把阈值改回需求的24小时即可
内容的提问来源于stack exchange,提问作者Ruishoo
相关产品推荐
相关产品推荐

