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

从SQL Server现有证书提取DNS列表并创建新证书的PowerShell问题

解决SQL Server证书SAN DNS名称格式转换问题

问题分析

你当前通过证书扩展的格式化输出获取SAN DNS名称,得到的是每行带DNS Name=前缀的多行文本,无法直接用于Get-Certificate的-DnsName参数(该参数需要逗号分隔字符串或字符串数组)。另外使用fl DNSnamelist出现输出截断,是因为格式化列表的默认宽度限制,但证书对象本身提供了更可靠的属性直接获取DNS名称列表,无需依赖格式化输出。

解决方案

方法1:直接读取证书的DNSNameList属性(推荐)

证书对象自带DNSNameList属性,返回纯净的DNS名称字符串数组,直接用-join ','即可转换为逗号分隔字符串,无需解析格式化文本:

$RegistryPath = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQLServer\SuperSocketNetLib'
$sqlthumbprint= Get-ItemPropertyValue -Path $RegistryPath -Name Certificate
$currentsqlcert= Get-ChildItem -Recurse Cert:\LocalMachine\My | Where-Object {$_.Thumbprint -eq $sqlthumbprint} 

# 直接从证书属性获取DNS名称列表并转换为逗号分隔字符串
$sna = $currentsqlcert.DNSNameList -join ','

$subjectname = $currentsqlcert.Subject  # 直接读取证书Subject属性,避免重复查询证书存储
Get-Certificate -Template "SQLServer" -SubjectName $subjectname -DnsName $sna -CertStoreLocation cert:\LocalMachine\My 

方法2:处理现有格式化文本(备选)

如果必须基于已有的多行格式化文本转换,可使用正则替换和字符串处理:

# 针对你当前获取的$sna多行文本进行转换
$sna = $sna -replace '^DNS Name=', '' -replace "`r`n", ',' -replace ',$', ''
  • -replace '^DNS Name=', '':移除每行开头的DNS Name=前缀
  • -replace "rn", ',':将换行符替换为逗号
  • -replace ',$', '':去除末尾多余的逗号

额外优化说明

  • 避免重复调用Get-ChildItem Cert:\LocalMachine\My,获取$currentsqlcert后直接读取其属性即可,提升脚本效率
  • Get-Certificate的-DnsName参数支持直接传入字符串数组,因此也可以省略逗号转换步骤,直接传入证书的DNSNameList属性:
    Get-Certificate -Template "SQLServer" -SubjectName $subjectname -DnsName $currentsqlcert.DNSNameList -CertStoreLocation cert:\LocalMachine\My 
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:18:23