从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
相关产品推荐
相关产品推荐

