PowerShell自动化域控制器巡检需满足三项前提:域管理员权限、RSAT-AD-PowerShell模块已安装、执行策略为RemoteSigned或Unrestricted;涵盖复制状态、FSMO角色、DNS健康、关键服务、安全事件五项检查,支持HTML报告生成、邮件发送及每日定时任务。
用 powershell 自动化执行域控制器日常巡检,核心是把人工检查项转化为可批量运行、可定时触发、可输出结构化结果的脚本。不需要手动点开事件查看器或逐台登录查状态,几条命令就能拉取关键指标。
巡检前必须确认的三项基础条件
脚本能否跑通,取决于底层环境是否就绪:
- 当前账户必须是域管理员,且在目标域控制器上有本地管理员权限
- 已安装 RSAT-AD-PowerShell 模块(Windows Server 2016+ 默认内置;旧系统需手动添加)
- PowerShell 执行策略设为 RemoteSigned 或 Unrestricted(Set-ExecutionPolicy RemoteSigned -Scope LocalMachine)
五个高频巡检项及对应 PowerShell 命令
以下命令可单独运行,也可合并为一个巡检脚本,每次执行返回清晰的状态标记(如 Pass / Fail / Warning):
- 域复制状态检查:运行 repadmin /replsummary 或 Get-ADReplicationPartnerMetadata -Target (Get-ADDomainController).HostName,重点看“Last Replication Attempt”和“Last Replication Success”时间差是否超 15 分钟
- FSMO 角色持有者验证:运行 Get-ADForest | Select-Object DomainNamingMaster, SchemaMaster 和 Get-ADDomain | Select-Object PDCEmulator, RIDMaster, InfrastructureMaster,确认角色未意外漂移
- DNS 服务健康度:运行 Get-DnsServerZone | Where-Object IsAutoCreated -eq $false | ForEach-Object { Get-DnsServerZoneTransfer -ZoneName $_.ZoneName },检查主辅同步是否启用且无错误
- 关键服务运行状态:运行 Get-Service -Name "NTDS", "DNS", "KDC", "Netlogon" | Select-Object Name, Status, StartType,确保全部为 Running 且启动类型为 Automatic
- 最近安全事件告警:运行 Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4740,4767,4771; StartTime=(Get-Date).AddHours(-24)} -MaxEvents 10,快速定位 24 小时内账户锁定、密码失败、Kerberos 预身份验证失败等高危事件
一键生成巡检报告并邮件发送
把上述命令封装成脚本后,加几行就能导出 HTML 报告并自动发邮件:
- 用 ConvertTo-Html 将结果转为带样式的网页,保存为 DC-Health-Report-$(Get-Date -Format 'yyyyMMdd-HHmm').html
- 调用 Send-MailMessage,指定 SMTP 服务器、发件人、收件人和附件路径(注意提前配置好凭据或使用本地 Relay)
- 加入 Start-Transcript 记录完整执行日志,便于事后回溯异常上下文
设置每日自动巡检任务
把脚本注册为计划任务,真正实现无人值守:
- 使用 Register-ScheduledTask 创建任务,触发器设为每天凌晨 2:00
- 操作设置为启动程序 powershell.exe,参数填 -File "C:\Scripts\Run-DCHealthCheck.ps1" -ExecutionPolicy Bypass
- 勾选“使用最高权限运行”,并指定域管理员账户(避免交互式会话限制)


















