证书颁发者替换为 CN 或 OU,System.Collections.Hashtable+ValueCollection CSV 错误

Certificate Issuer Replace by CN or OU,System.Collections.Hashtable+ValueCollection CSV Error

<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
  border: 1px solid black;
  border-collapse: collapse;
}
</style>
</head>
<body>

<table style="width:100%">
  <tr>
    <th>...</th>
    <th>Issuer</th>
    <th>...</th>
  </tr>
  <tr>
    <td>...</td>
    <td>System.Collections.Hashtable+ValueCollection
</td>
    <td>...</td>
  </tr>
  <tr>
    <td>...</td>
    <td>System.Collections.Hashtable+ValueCollection
</td>
    <td>...</td>
  </tr>
  <tr>
    <td>...</td>
    <td>System.Collections.Hashtable+ValueCollection
    </td>
    <td>...</td>
  </tr>
</table>

</body>
</html>

我想从我的数组中替换 $_.Issuer 以包含 CN= 仅当没有 OU=.

所以逻辑是

  1. 如果行首没有CN=,则从$_Issuer字段中获取OU=

  2. 否则从 $_.Issuer 字段中获取 CN= 的文本,然后 return $_.Issuer 字段

cls

$array = @() 

Get-ChildItem -Recurse | ForEach-Object ({
    $obj = New-Object -TypeName PSObject
    $obj | Add-Member -MemberType NoteProperty -Name "PSPath" -Value $_.PSPath
    $obj | Add-Member -MemberType NoteProperty -Name "FriendlyName" -Value $_.FriendlyName
    if ( $_.Issuer -Match ("(?<=^(?:CN|OU)=)[^,\r\n]+")) {
        $matches.Values
    }
    $obj | Add-Member -MemberType NoteProperty -Name "Issuer" -Value $matches.values
    $obj | Add-Member -MemberType NoteProperty -Name "NotAfter" -Value $_.NotAfter
    $obj | Add-Member -MemberType NoteProperty -Name "NotBefore" -Value $_.NotBefore
    $obj | Add-Member -MemberType NoteProperty -Name "SerialNumber" -Value $_.SerialNumber
    $obj | Add-Member -MemberType NoteProperty -Name "Thumbprint" -Value $_.Thumbprint
    $obj | Add-Member -MemberType NoteProperty -Name "DnsNameList" -Value $_.DnsNameList
    $obj | Add-Member -MemberType NoteProperty -Name "Subject" -Value $_.Subject
    $obj | Add-Member -MemberType NoteProperty -Name "Version" -Value $_.Version

    $array += $obj

    $obj = $null 
})

$array | Export-Csv -Path "c:\temp\temp4.csv"

例如,

CN=Microsoft Root Certificate Authority 2010, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
CN=Avast Web/Mail Shield Root, O=Avast Web/Mail Shield, OU=generated by Avast Antivirus for SSL/TLS scanning
OU=Copyright (c) 1997 Microsoft Corp., OU=Microsoft Time Stamping Service Root, OU=Microsoft Corporation, O=Microsoft Trust Network

应该return

Microsoft Root Certificate Authority 2010
Avast Web/Mail Shield Root
Copyright (c) 1997 Microsoft Corp.

但是现在我遇到了一个问题,发行者在找到正确的匹配项后没有保存到 CSV 文件中。找到匹配项后,我的 CSV 文件中的 Issuer 列将填写 "System.Collections.Hashtable+ValueCollection"。有人可以让我知道我做错了什么吗?

感谢 Wiktor + iRon,我能够回答我的问题。这解决了 OU 和 CN 答案,并且还能够使用匹配的 OU 和 CN Issuer 写入 csv 文件。这是有效的完整脚本。 :)

cls

$array = @() 

Get-ChildItem -recurse |
foreach-object ({ 

$obj = New-Object -TypeName PSObject
$obj | Add-Member -MemberType NoteProperty -Name "PSPath" -Value $_.PSPath
$obj | Add-Member -MemberType NoteProperty -Name "FriendlyName" -Value $_.FriendlyName
if( $_.Issuer -match ("(?<=^(?:CN|OU)=)[^,\r\n]+")) {
$matches.values
}
$Obj | Add-Member -MemberType NoteProperty -Name "Issuer" -Value "$($matches.values)"
$obj | Add-Member -MemberType NoteProperty -Name "NotAfter" -Value $_.NotAfter
$obj | Add-Member -MemberType NoteProperty -Name "NotBefore" -Value $_.NotBefore
$obj | Add-Member -MemberType NoteProperty -Name "SerialNumber" -Value $_.SerialNumber
$obj | Add-Member -MemberType NoteProperty -Name "Thumbprint" -Value $_.Thumbprint
$obj | Add-Member -MemberType NoteProperty -Name "DnsNameList" -Value $_.DnsNameList
$obj | Add-Member -MemberType NoteProperty -Name "Subject" -Value $_.Subject
$obj | Add-Member -MemberType NoteProperty -Name "Version" -Value $_.Version

$array += $obj


$obj = $null 
$matches.values = $null

}) 

$array | Export-Csv -Path "c:\temp\temp4.csv"

您需要的正则表达式实际上是一个匹配字符串开头 OU=CN= 之后的非逗号块的模式(默认情况下,Powershell 逐行处理文件,因此它将像在行的开头一样):

(?<=^(?:CN|OU)=)[^,]+

如果读入整个文件,需要强制^(?m) RegexOptions.Multiline修饰符匹配行开始位置:

(?m)(?<=^(?:CN|OU)=)[^,\r\n]+

详情

  • (?m) - 开启多行模式,使 ^ 匹配行首位置
  • (?<=^(?:CN|OU)=) - 正向后视需要在当前位置
  • 左侧的字符串开头处使用 CN=OU=
  • [^,\r\n]+ - 除了逗号、CR 和 LF 符号之外的一个或多个字符。