Powershell 获取预期用途的证书

Powershell 获取预期用途的证书,powershell,ssl,Powershell,Ssl,我有这段代码,它获取有关“本地机器”SSL证书的信息,并将它们存储在CSV文件中。我担心的是,我没有找到定义这些证书的正确名称。所以我问是否有一个字段指示证书名 另外,我想存储SSL证书的“预期用途”,但我不知道如何实现 最后一个问题,我发现有些证书的“预期用途”字段有一个ALL值,所以我想知道本例中提到的用途是什么 这是我的脚本,我希望它向我显示“预期用途”,如果找到证书的名称 $StartDate=获取日期 $CertPath='Cert:\LocalMachine' $CertsDetai

我有这段代码,它获取有关“本地机器”SSL证书的信息,并将它们存储在CSV文件中。我担心的是,我没有找到定义这些证书的正确名称。所以我问是否有一个字段指示证书名

另外,我想存储SSL证书的“预期用途”,但我不知道如何实现

最后一个问题,我发现有些证书的“预期用途”字段有一个
ALL
值,所以我想知道本例中提到的用途是什么

这是我的脚本,我希望它向我显示“预期用途”,如果找到证书的名称

$StartDate=获取日期
$CertPath='Cert:\LocalMachine'
$CertsDetail=Get ChildItem-Path$CertPath-Recurse | Where对象{
$\ PsIsContainer-ne$真
}| ForEach对象{
$DaysLeft=(新的时间跨度-开始$StartDate-结束$\u0.NotAfter)。天
如果($DaysLeft-lt 1){
$Under30=$true
$Expired=$true
$Text=“证书已过期”
}elseif($DaysLeft-lt 30){
$Under30=$true
$Expired=$false
$Text=“证书有效,但即将过期”
}否则{
$Under30=$false
$Expired=$false
$Text=“证书仍然有效,不会很快过期”
}
$FinalDate=获取日期$\ n.NotAfter-格式为'dd/MM/yyyy hh:MM'
[PSCustomObject]@{
Text=$Text
主题=$\主题
过期日期=$FinalDate
DaysRemaining=$DaysLeft
30天以下=30天以下$
过期=$Expired
}
}
$CertsDetail | Where对象{
$\天维护-lt 3650
}|导出Csv-NoTypeInformation-路径“C:\SECnology\Data\Utilities\Certificate\u State.Csv”

以下脚本迭代证书扩展,如果使用,则存储在变量$Usage中,该变量并入[PSCustomObject]

编辑:合并有价值的提示

## Q:\Test\2019\05\22\SO_56254011.ps1
$StartDate = Get-Date
$CertPath  = 'Cert:\LocalMachine\'
$FileOut   = 'C:\SECnology\Data\Utilities\Certificate_State.csv'
$CertsDetail = Get-ChildItem -Path $CertPath -Recurse | Where-Object {
    $_.PsIsContainer -ne $true
} | ForEach-Object {
    $DaysLeft = (New-TimeSpan -Start $StartDate -End $_.NotAfter).Days
    if ($DaysLeft -lt 1) {
        $Under30 = $true
        $Expired = $true
        $Text = "The Certificate is expired"
    } elseif ($DaysLeft -lt 30) {
        $Under30 = $true
        $Expired = $false
        $Text = "The Certificate is but valid about to expire"
    } else {
        $Under30 = $false
        $Expired = $false
        $Text = "The Certificate is still valid and not going soon to expire"
    }
    $FinalDate = Get-Date $_.NotAfter -Format 'dd/MM/yyyy hh:mm'
    $Usages = foreach($key in $_.Extensions){
      if('KeyUsages' -in $key.psobject.Properties.Name ){ $key.KeyUsages}
      if('EnhancedKeyUsages' -in $key.psobject.Properties.Name){
          $key.EnhancedKeyUsages.FriendlyName
      }
    }
    [PSCustomObject]@{
        Text         = $Text
        Subject       = $_.Subject
        ExpireDate    = $FinalDate
        DaysRemaining = $DaysLeft
        Under30Days   = $Under30
        Expired       = $Expired
        Usages        = $Usages-join ';'
    }
}
$CertsDetail | Out-Gridview
$CertsDetail | Where-Object {
    $_.DaysRemaining -lt 3650
} | Export-Csv -NoTypeInformation -Path $FileOut
样本输出

Text          : The Certificate is expired
Subject       : CN=SITHS CA v3, O=Carelink, C=SE
ExpireDate    : 28-11-2015 07:02
DaysRemaining : -1271
Under30Days   : True
Expired       : True
Usages        : CrlSign, KeyCertSign

请参阅如何扩展包含目的的扩展。我尝试了代码,但它没有显示任何结果或错误。谢谢,它起作用了,但我找到了一些空字段和其他包含System.Object[]的字段在我的csv文件中,如果您将certs与
certlm.msc
进行比较,输出是否不同?我使用
| Out字符串更正了
System.Object[]
。在$Usages行末尾修剪()
,但对于空字段,我与certlm.msc进行了比较,结果相同(一些空字段)1
if($key.psobject.Properties.Name中的'KeyUsages'{$key.KeyUsages}
if($key.psobject.Properties.Name中的'EnhancedKeyUsages'{$key.EnhancedKeyUsages.FriendlyName}
和2<代码>用法=$Usages-join';'PSCustomObject时的代码>。