我有一些 Windows 上的证书。这些证书有不同的模板。
我可以获得指纹:
$Certificates = get-childitem cert:\LocalMachine\My
我可以获得模板:
$Template = ($Certificates.extensions | where-object{$_.oid.FriendlyName -match "Certificate Template Information"}).format(0)
所以我想使用powershell根据指纹自动删除具有特定模板的证书。
将其包裹在
Where-Object
过滤器中:
Get-ChildItem cert:\my\ |Where-Object{
($TmplExt = $_.Extensions |Where-Object {
$_.Oid.FriendlyName -match 'Certificate Template'
}) -and
$TmplExt.format(0) -match 'MyTemplateName'
} |Remove-Item
其实有点复杂。
名字可能会根据系统的区域设置而改变:坚持使用对象标识符 (OID) 值。
根据天气情况,证书请求是否是从加入域的计算机创建的,扩展可能具有名称或仅具有 OID。
这是我用来读取模板的内容,首选其显示名称,回退到 OID,并进行 AD 查找,以防名称尚未同步:
$certificate.Extensions `
| Where-Object { "1.3.6.1.4.1.311.21.7" -eq $_.Oid.Value } `
| Select-Object @{ Name = "Name"; Expression = { $_.Format($false) }} `
| Select-Object @{
Name = "Name";
Expression = {
if($_.Name.IndexOf("(1.3.6.1.4.1.311.21.8.") -eq -1) {
$oidValue = $_.Name.SubString(`
$_.Name.IndexOf("=") + 1,
$_.Name.IndexOf(",") - 1 - $_.Name.IndexOf("="));
$oidLookUp = `
(New-Object System.Security.Cryptography.Oid($oidValue))`
.FriendlyName;
if($false -eq [String]::IsNullOrWhiteSpace($oidLookUp)){
$oidLookUp;
} else {
try{
$ConfigContext = `
([ADSI]"LDAP://RootDSE").ConfigurationNamingContext;
$ADSI = [ADSI]"LDAP://CN=Certificate Templates," + `
"CN=Public Key Services,CN=Services,$ConfigContext";
$oidLookUp = $ADSI.Children `
| Where-Object { $_.'msPKI-Cert-Template-OID' -eq $oidValue } `
| Select-Object -ExpandProperty displayName -First 1;
} catch{ }
if($false -eq [String]::IsNullOrWhiteSpace($oidLookUp)){
$oidLookUp;
} else {
$oidValue;
}
}
} else {
$_.Name.SubString(`
$_.Name.IndexOf("=") + 1, `
$_.Name.IndexOf("(1.3.6.1.4.1.311.21.8.")
- 1
- $_.Name.IndexOf("="))
}
}
} `
| Select-Object -ExpandProperty Name -First 1;