如何批量获取域内所有服务器个人证书存储中的证书列表
批量获取域内特定OU服务器本地证书列表的解决方案
核心思路
利用PowerShell远程执行(WinRM)批量拉取目标服务器的证书信息,显式指定需要导出的字段,同时处理DnsNameList这类特殊集合类型字段的格式问题,避免导出内容失真。
完整脚本示例
# 配置参数,替换为你的实际路径 $OUPath = "OU=Servers,DC=yourdomain,DC=com" $ExportCsvPath = "\\fileserver\share\all_server_certs.csv" $ErrorLogPath = "\\fileserver\share\cert_collection_errors.log" # 1. 获取目标OU内启用状态的服务器列表 $servers = Get-ADComputer -Filter {Enabled -eq $true} -SearchBase $OUPath | Select-Object -ExpandProperty Name # 2. 批量远程获取证书并整理字段 $allCertificates = Invoke-Command -ComputerName $servers -ErrorAction SilentlyContinue -ErrorVariable commandErrors -ScriptBlock { Get-ChildItem Cert:\LocalMachine\My | Select-Object ` @{Name='ComputerName'; Expression={$env:COMPUTERNAME}}, FriendlyName, NotBefore, NotAfter, HasPrivateKey, Issuer, Subject, Thumbprint, @{Name='DnsNameList'; Expression={$_.DnsNameList -join ';'}} # 将DNS列表转为分号分隔的字符串 } # 3. 导出结果到CSV $allCertificates | Export-Csv -Path $ExportCsvPath -NoTypeInformation -Encoding UTF8 # 4. 记录执行失败的服务器(可选) if ($commandErrors) { $commandErrors | Select-Object TargetObject, Exception | Export-Csv -Path $ErrorLogPath -NoTypeInformation -Encoding UTF8 }
关键细节说明
- 特殊字段处理:
DnsNameList是集合类型,直接导出CSV会显示类型名称而非实际域名,通过-join ';'转为字符串,方便查看和后续分析。 - 在线服务器过滤:如果只想针对在线服务器执行,可在获取
$servers后加入验证:$servers = $servers | Where-Object { Test-Connection $_ -Count 1 -Quiet -TimeoutSeconds 2 } - 权限与依赖:
- 执行脚本的账号需要目标服务器的管理员权限
- 目标服务器需开启WinRM(可通过
Enable-PSRemoting -Force批量配置) - 防火墙需允许WinRM默认端口(5985/5986)
解决你之前的问题
之前脚本只生成30条且字段缺失,原因通常是:
- 未显式指定需要的字段,默认导出的属性不全
- 未处理
DnsNameList这类特殊字段,导致导出时丢失内容 - 未处理远程执行的超时或错误,部分服务器未成功返回数据
内容的提问来源于stack exchange,提问作者NullCool
相关产品推荐
相关产品推荐

