Windows AD PowerShell(十二):磁盘与性能
这是 Windows AD PowerShell 学习记录的第十二节。磁盘空间、目录数据库大小、LDAP 查询量和复制队列,是域控变慢时常见的四条线索;单独一项异常不等于已经找到根因。## 十二、磁盘与性能
# 查磁盘空间Get-PSDrive C | Select Used, Free
# 查 NTDS.dit 大小Get-Item "C:\Windows\NTDS\ntds.dit" | Select Length
# LDAP 性能计数器Get-Counter "\NTDS\LDAP Searches/sec" -SampleInterval 1 -MaxSamples 5Get-Counter "\NTDS\DRA Pending Replication Synchronizations"
# 查 RPC 动态端口netstat -an | findstr 49152💡 NTDS.dit 会随删除操作持续膨胀,删除用户不会让它变小。 要真正回收空间必须做离线碎片整理(
ntdsutil→activate instance ntds→compact to), 期间 AD 服务中断,需停机窗口。💡
DRA Pending Replication Synchronizations持续不降 = 复制积压, 配合repadmin /replsummary一起看。
数据来源说明:2026 年 9 月 28 日对实验域控
QYNET-CORE01做了只读远程 WMI 查询,取得了C:容量、ntds.dit文件大小和一组 NTDS 性能计数器快照。下面标注“VM 实测”的数值来自这次查询;Get-PSDrive、Get-Item、Get-Counter、netsh和netstat并未在该 VM 控制台逐条运行,它们的输出如有展示会明确标为格式示例。本节未清理文件、停止服务或压缩数据库。
十二、磁盘与性能
12.1 查询磁盘空间
在域控本机运行最简单的查看命令:
Get-PSDrive C | Select-Object Name,Used,Free
# 格式示例;Used 和 Free 的原始单位是字节Name Used Free---- ---- ----C 22953246720 40876716032如果想直接看 GiB,避免盯着长串数字计算:
Get-PSDrive C | Select-Object Name, @{Name='UsedGiB';Expression={[math]::Round($_.Used / 1GB, 2)}}, @{Name='FreeGiB';Expression={[math]::Round($_.Free / 1GB, 2)}}
# 按本次远程 WMI 数值换算的示例展示,并非这条命令的实机直出Name UsedGiB FreeGiB---- ------- -------C 21.38 38.07**VM 实测:**远程读取 Win32_LogicalDisk 得到 C: 总容量 63,829,962,752 字节(约 59.45 GiB),空闲 40,876,716,032 字节(约 38.07 GiB)。上面的 Used 是用总容量减空闲容量得到的对应值。查看其他卷时,把 C 换成目标盘符即可。
还可以查询卷的总量、文件系统和剩余空间:
Get-Volume -DriveLetter C | Select-Object DriveLetter,FileSystem,Size,SizeRemaining
# 格式示例;同样按 VM 的远程查询值填写容量,未在 VM 上执行 Get-VolumeDriveLetter FileSystem Size SizeRemaining----------- ---------- ---- -------------C NTFS 63829962752 40876716032排障时不能只看 C::如果 AD 数据库、事务日志、SYSVOL 或备份被放在其他卷,也要查对应盘。磁盘接近满额时先确认哪个目录在增长;不要凭“空间不够”就清理 NTDS 日志或直接删除数据库文件。
12.2 查询 ntds.dit 大小
ntds.dit 是 AD DS 的目录数据库文件。先查看实际路径与大小:
Get-Item 'C:\Windows\NTDS\ntds.dit' | Select-Object FullName,Length, @{Name='SizeMiB';Expression={[math]::Round($_.Length / 1MB, 2)}}
# 格式示例;长度与本次远程 WMI 实测值相同FullName Length SizeMiB-------- ------ -------C:\Windows\NTDS\ntds.dit 54525952 52**VM 实测:**通过远程 CIM_DataFile 按文件名查询,C:\Windows\NTDS\ntds.dit 的 FileSize 为 54,525,952 字节,即 52 MiB。路径可能因安装方式而不同,不能把 C:\Windows\NTDS 当成所有 DC 的固定位置;可在 DC 上通过 ntdsutil 的 files → info 核对数据库与日志目录。
💡 删除对象后,数据库文件通常不会立刻变小。 AD 会定期进行在线整理,回收数据库内部可重复利用的空间,但不会因此缩小磁盘上的
ntds.dit文件。启用 AD 回收站后,已删除对象在可恢复期内还会保留属性,更不能期待“删几个用户,文件立刻缩小”。观察数据库大小要看长期趋势,而不是一次删除后的瞬时变化。
真需要缩小文件时:离线碎片整理
微软文档给出的 ntdsutil 路径大致如下,这里仅用于识别流程,本文不执行:
ntdsutilactivate instance ntdsfilesinfocompact to D:\CompactNTDScompact to 会在指定目录生成一份新的数据库;执行它并不意味着已经自动替换生产数据库。要先有经验证的系统状态备份、足够的临时空间和维护窗口,并停止 AD DS 服务或在 DSRM 中操作;之后还要按工具提示完成数据库替换、日志处理与服务验证。整个过程可能造成 AD 服务中断,不能作为日常“清磁盘”手段。若只因文件看起来大就压缩,通常得不偿失。
12.3 观察 LDAP 查询速率
在 DC 上按 1 秒间隔取 5 次 LDAP Searches/sec:
Get-Counter '\NTDS\LDAP Searches/sec' -SampleInterval 1 -MaxSamples 5 | ForEach-Object { [pscustomobject]@{ TimeStamp = $_.TimeStamp SearchesPerSec = [math]::Round($_.CounterSamples[0].CookedValue, 2) } }
# 格式示例,不是 VM 上执行 Get-Counter 的五次采样TimeStamp SearchesPerSec--------- --------------2026/9/28 15:01:01 02026/9/28 15:01:02 12026/9/28 15:01:03 02026/9/28 15:01:04 02026/9/28 15:01:05 2VM 实测:远程读取 Win32_PerfFormattedData_NTDS_NTDS 的单次快照时,LDAPSearchesPersec = 0。这只能说明采样当时没有观察到每秒 LDAP 搜索量,不能证明平时没有流量或性能问题。排障应在慢的时段持续采样,与 CPU、磁盘延迟、NTDS\ATQ Request Latency 等指标及客户端日志一起看。
⚠️ 性能计数器名称可能本地化。 上面的
\NTDS\...是英文系统上的常见写法;中文 Windows 若提示找不到路径,先在目标 DC 上执行Get-Counter -ListSet * | Where-Object CounterSetName -match 'NTDS|目录',检查该机器列出的实际Paths,不要把“计数器路径不匹配”误判为 NTDS 服务不存在。
12.4 观察复制队列
这个计数器表示本 DC 等待处理的目录同步请求数:
Get-Counter '\NTDS\DRA Pending Replication Synchronizations' ` -SampleInterval 5 -MaxSamples 3 | ForEach-Object { [pscustomobject]@{ TimeStamp = $_.TimeStamp Pending = $_.CounterSamples[0].CookedValue } }
# 格式示例,不是 VM 上执行 Get-Counter 的三次采样TimeStamp Pending--------- -------2026/9/28 15:02:05 02026/9/28 15:02:10 02026/9/28 15:02:15 0VM 实测:同一组 WMI 性能快照中,DRAPendingReplicationSynchronizations = 0,DRAPendingReplicationOperations = 0。这是一个时间点的本机队列值,不是复制成功证明。队列长时间升高或不下降,才提示需要进一步查复制任务是否积压;即使为 0,仍可能是没有启动新的复制请求,或者复制伙伴不可达。因此还要配合:
repadmin /replsummaryrepadmin /showrepl QYNET-CORE01repadmin /queue QYNET-CORE01
# 这些命令本节未在 VM 上执行;解释与输出参见第五节如果 repadmin 报错,先按第五节:复制健康核对失败码、伙伴和最后成功时间,不能仅凭性能计数器把原因归到磁盘或网络。
12.5 RPC 动态端口:别只盯 49152
原大纲写了 netstat -an | findstr 49152。它只是在文本中搜到数字 49152 的行,既无法看到整个动态端口范围,也不能证明搜到的连接就是 AD 复制使用的 RPC。Windows 常见默认动态 TCP 端口范围是 49152–65535,但可以修改;先查本机配置:
netsh int ipv4 show dynamicport tcp
# 格式示例,未在本次 VM 上执行Protocol tcp Dynamic Port Range---------------------------------Start Port : 49152Number of Ports : 16384如需查看当前有哪些高端口正在监听:
Get-NetTCPConnection -State Listen | Where-Object { $_.LocalPort -ge 49152 -and $_.LocalPort -le 65535 } | Select-Object LocalAddress,LocalPort,OwningProcess
# 格式示例;监听端口会随机器和时间变化LocalAddress LocalPort OwningProcess------------ --------- -------------0.0.0.0 49666 764可再用 Get-Process -Id <OwningProcess> 确认进程;但在高端口监听也不代表它一定是 RPC。排查 DC 复制的 1722 错误时,还要检查 DNS、RPC Endpoint Mapper 的 TCP 135、端点映射返回的实际端口,以及两台 DC 之间的防火墙和路由。Test-NetConnection 只测通 135,也不能证明后续动态端口都能通。
12.6 三种常见现象怎么串起来看
| 现象 | 先查什么 | 不要急着做什么 |
|---|---|---|
| DC 磁盘告警、登录变慢 | 各卷剩余空间、NTDS/日志/备份所在目录、磁盘 I/O | 删 NTDS 日志或直接压缩数据库 |
| LDAP 查询量突然增加 | 持续采样搜索量、请求延迟、CPU,以及应用端请求模式 | 单凭一次高数值就认定是 AD 数据库损坏 |
| 复制延迟、队列持续增长 | repadmin /replsummary、/showrepl、/queue,再看磁盘/网络/伙伴状态 | 不问原因就全林 repadmin /syncall /AdeP |
这里尤其要记住:磁盘容量、数据库文件大小、队列长度和实际服务健康,是四个不同的问题。 本次实验机 ntds.dit 只有 52 MiB、队列快照为 0,但这两个数字本身不构成“AD 一切正常”的结论。
参考资料
- Microsoft Learn:AD 数据库离线碎片整理
- Microsoft Learn:LDAP 性能调优考虑因素
- Microsoft Learn:Get-Counter 与本地化计数器名称
- Microsoft Learn:复制队列查询命令
- Microsoft Learn:动态端口范围
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













