Win7 32位PowerShell3.0获取证书时EnhancedKeyUsageList为空求助
兄弟,这真不是你操作出问题了,完全是PowerShell版本和证书对象处理逻辑的兼容性差异导致的!
问题根源
- 你用的Windows 7自带的PowerShell 3.0,对证书对象的
EnhancedKeyUsageList属性支持有缺陷:它不会自动把证书底层的扩展数据解析成可读的对象,所以用Format-List *输出时就只会显示空大括号{}。 - 而Windows 10的PowerShell 5.x版本,微软改进了证书提供程序的实现,会自动解析这个属性的内容,所以能正常展示结果。
针对PowerShell 3.0的解决办法
给你两种实用的方式,手动解析出EnhancedKeyUsageList的内容:
方式1:快速提取可读字符串
直接遍历证书的扩展项,找到增强密钥用法扩展后转成可读格式:
Get-ChildItem -Path Cert:\LocalMachine\My | ForEach-Object { # 定位到增强密钥用法扩展 $ekuExtension = $_.Extensions | Where-Object { $_.Oid.FriendlyName -eq "Enhanced Key Usage" } # 构建自定义对象输出关键信息 [PSCustomObject]@{ 证书指纹 = $_.Thumbprint 证书主题 = $_.Subject 增强密钥用法 = if ($ekuExtension) { $ekuExtension.Format(0) } else { "未定义增强密钥用法" } } } | Format-List
这段代码会把每个证书的EKU内容转换成易读的字符串,和你在PS5.x里看到的格式差不多。
方式2:结构化提取EKU项
如果需要后续处理EKU的具体条目,可以用.NET类手动解析,得到更规整的输出:
Get-ChildItem -Path Cert:\LocalMachine\My | ForEach-Object { # 通过OID值定位EKU扩展(2.5.29.37是增强密钥用法的标准OID) $ekuRawExt = $_.Extensions | Where-Object { $_.Oid.Value -eq "2.5.29.37" } if ($ekuRawExt) { # 用.NET类解析原始数据 $ekuObj = New-Object System.Security.Cryptography.X509Certificates.X509EnhancedKeyUsageExtension($ekuRawExt.RawData, $false) # 提取每个EKU的友好名称 $ekuItems = $ekuObj.EnhancedKeyUsages | ForEach-Object { $_.FriendlyName } } else { $ekuItems = @("未定义增强密钥用法") } # 输出结构化对象 [PSCustomObject]@{ 证书指纹 = $_.Thumbprint 证书主题 = $_.Subject 增强密钥用法列表 = $ekuItems -join "; " } } | Format-List
这种方式会把每个EKU条目单独提取出来,用分号分隔,方便后续筛选或处理。
额外建议
Windows 7和PowerShell 3.0都已经过了微软的支持周期,如果平时经常和证书打交道,还是建议升级到Windows 10/11这类新系统,不仅能避免这类兼容性问题,还能用到更多PowerShell的新功能。
内容的提问来源于stack exchange,提问作者creg




