证书颁发者替换为 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=
.
时
所以逻辑是
如果行首没有CN=,则从$_Issuer
字段中获取OU=
否则从 $_.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 符号之外的一个或多个字符。
<!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=
.
所以逻辑是
如果行首没有CN=,则从
$_Issuer
字段中获取OU=
否则从
$_.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)=)
- 正向后视需要在当前位置 左侧的字符串开头处使用 [^,\r\n]+
- 除了逗号、CR 和 LF 符号之外的一个或多个字符。
CN=
或 OU=