You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动