使用powershell格式化证书列表

时间:2018-04-13 06:31:06

标签: powershell

我试图通过PowerShell获取证书列表

$list = Dir Cert:\LocalMachine\My | Select Issuer

我明白了:

Issuer
---------
CN=*.google.com, OU=IT, O=Google, L=Texax
DC=Windows Server
CN=GOOGLE_MAIN, C=US
CN=localhost
DC=Windows Server Certificate Generator
CN=*.microsoft.com, OU=IT, O=Microsoft, L=Texas
CN=*.gmail.com, OU=IT, O=Google, L=Texax
DC=Windows Server ABC Certificate Generator
CN=*.stackoverflow.com, OU=IT, O=Google, L=Texax
DC=Windows Server XYZ Certificate Generator
CN=yahoo.com, OU=IT, O=Google, L=Texax

然后我想取名字(来自CN,忽略DC和其他),例如* .google.com或* .stackoverflow.com

foreach ($cert in $list) {
   $cert = $list | Select-String -Pattern 'CN\=([^,\r\n]+)'
}

但如果没有更改,名称仍然类似于CN = *。google.com,OU = IT,O = Google,L = Texax

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

以下是使用正则表达式的选项,但不适用于Select-String

Get-ChildItem Cert:\LocalMachine\My |
    ForEach-Object {
        if($_.Issuer -match "CN=(?<cn>[^,\r\n]+)")
        {
            $matches.cn
        }
    }

这只是输出CN值的列表。如果您稍后需要在脚本中使用它们,则可以继续使用管道,也可以以某种方式捕获值。例如,将它们添加到数组中:

$cnValues = @()

Get-ChildItem Cert:\LocalMachine\My |
    ForEach-Object {
        if($_.Issuer -match "CN=(?<cn>[^,\r\n]+)")
        {
            $cnValues += $matches.cn
        }
    }

$cnValues

您无法更改返回对象上Issuer的值,因为这是只读的。如果您需要具有此修改值的对象,则选项包括添加另一个属性(通过Add-Member)或创建您自己的自定义对象(例如使用[PsCustomObject]),只包含您需要的属性,包括您计算的CN值。

答案 1 :(得分:0)

以下是一个快速示例,说明如何针对单个证书进行此操作。我会把循环留给你!

$certificate = Dir Cert:\LocalMachine\TrustedPublisher
$issuer = $certificate.Issuer

$parts = $issuer.Split(",")

$cn = $parts | Where-Object {$_ -like "cn*"}

Write-Host $cn
Write-Host $cn.Replace("CN=", "") -ForegroundColor Green