我试图通过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
感谢您的帮助
答案 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