You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量获取域内所有服务器个人证书存储中的证书列表

批量获取域内特定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条且字段缺失,原因通常是:

  1. 未显式指定需要的字段,默认导出的属性不全
  2. 未处理DnsNameList这类特殊字段,导致导出时丢失内容
  3. 未处理远程执行的超时或错误,部分服务器未成功返回数据

内容的提问来源于stack exchange,提问作者NullCool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:49:58