PowerShell可通过组合Get-ADDomainController、Invoke-Command远程WMI查询及DirectoryEntry LDAP测试,分步获取域控在线状态、CPU/内存使用率、LDAP响应延迟和NTDS服务状态,实现轻量级域控负载评估。
powershell 本身不直接提供“域控负载”这一综合指标,但可以通过组合 active directory、wmi 和性能计数器等信息,获取当前在线域控制器列表,并分别采集 cpu、内存、ds 服务响应延迟、ldap 绑定成功率等关键负载维度。核心思路是:先发现在线域控,再逐台收集轻量级性能数据。
一、发现当前在线的域控制器
使用 Get-ADDomainController 获取所有域控,再通过 Test-Connection 或 Test-NetConnection 筛选实际可达的节点:
$OnlineDCs = Get-ADDomainController -Filter * | ForEach-Object {
if (Test-NetConnection $_.HostName -Port 389 -WarningAction SilentlyContinue | Where-Object { $_.TcpTestSucceeded }) {
$_
}
}注意:仅检查 LDAP(389)端口比 ping 更可靠,因部分环境禁 ping 但 LDAP 必须通;若需更高精度,可加 Get-ADRootDSE 验证 AD 服务是否真正就绪。
二、获取基础系统负载(CPU / 内存)
对每台在线域控,用 Invoke-Command 远程调用 WMI 查询:
$LoadData = $OnlineDCs | ForEach-Object {
$dc = $_.HostName
try {
$perf = Invoke-Command -ComputerName $dc -ScriptBlock {
$cpu = (Get-Counter '\Processor(_Total)\% Processor Time' -SampleInterval 1 -MaxSamples 2).CounterSamples.CookedValue | Measure-Object -Average | Select-Object -ExpandProperty Average
$mem = (Get-Counter '\Memory\% Committed Bytes In Use').CounterSamples.CookedValue
[PSCustomObject]@{
Server = $using:dc
CPU_Pct = [math]::Round($cpu, 1)
Memory_Pct = [math]::Round($mem, 1)
}
} -ErrorAction Stop
$perf
} catch {
[PSCustomObject]@{
Server = $dc
CPU_Pct = 'N/A'
Memory_Pct = 'N/A'
Error = $_.Exception.Message
}
}
}说明:采样 2 次取平均,避免瞬时抖动;需提前在域控上启用 PowerShell 远程处理(Enable-PSRemoting),且执行账户有本地管理员权限。
三、评估 AD 服务负载(LDAP 响应与 DS 健康)
真正反映域控“AD 负载”的是目录服务响应能力,可用以下方式快速探测:
- LDAP 绑定延迟:用 [System.DirectoryServices.ActiveDirectory.DomainController] 的 TestReplication 或手动测 Bind + Search 延迟
- DS 服务状态:查询 Win32_Service 中 NTDS 服务是否运行中
- 复制延迟(可选):运行 repadmin /replsummary 判断是否积压
示例(轻量级 LDAP 响应测试):
$ADLoad = $OnlineDCs | ForEach-Object {
$dc = $_.HostName
$ldapTime = try {
$sw = [System.Diagnostics.Stopwatch]::StartNew()
$root = [System.DirectoryServices.DirectoryEntry] "LDAP://$dc/rootDSE"
$root.Properties['currentTime'] | Out-Null
$sw.Stop()
$sw.ElapsedMilliseconds
} catch { 9999 }
[PSCustomObject]@{
Server = $dc
LDAP_Response_ms = if ($ldapTime -lt 9999) { $ldapTime } else { 'Timeout' }
NTDS_Service = (Invoke-Command -ComputerName $dc { Get-Service NTDS -ErrorAction SilentlyContinue }).Status
}
}四、整合输出与简单告警建议
将上述结果合并为统一视图,例如:
$Report = $LoadData | Join-Object -Right $ADLoad -LeftJoinProperty Server -RightJoinProperty Server $Report | Format-Table Server, CPU_Pct, Memory_Pct, LDAP_Response_ms, NTDS_Service -AutoSize
可追加逻辑:如 CPU_Pct > 85 或 LDAP_Response_ms > 500 标红提示;也可导出 CSV 或发邮件。注意避免高频轮询——生产环境建议间隔 ≥5 分钟。










