Получить сертификаты, срок действия которых истекает через месяц или меньше - PullRequest
1 голос
/ 19 июня 2019

Я хочу получить все сертификаты локального компьютера, срок действия которых истекает максимум через месяц, и сохранить их информацию в файле .csv. Я использовал этот код, но в нем также хранятся некоторые другие сертификаты, срок действия которых истекает более чем через месяц.

Вот код, который я написал:

$testPath = 'Cert:\LocalMachine\'
$testDetail = Get-ChildItem -Path $testPath -Recurse | Where-Object {
    $_.PSIsContainer -ne $true
} | ForEach-Object {
    $DaysLeft = (New-TimeSpan -Start $StartDate -End $_.NotAfter).Days

    $FinalDate = Get-Date $_.NotAfter -Format 'dd/MM/yyyy hh:mm'
    $Usages = ($_.Extensions | Where-Object {$_.KeyUsages}).KeyUsages
    if ($Usages) {
        # get at most two parts out of the $_.Issuer string
        $issuer = '{0}, {1}' -f ([regex] 'O=([^,]+)').Match($_.Issuer).Groups[1].Value, 
                                ([regex] 'CN=([^,]+)').Match($_.Issuer).Groups[1].Value
        $issuer = $issuer.Trim(", ")

        [PSCustomObject]@{
            Issuer             = $issuer.TrimStart('"')
            Usages             = $Usages.ToString() -replace ',', ';'
            Expire_Date        = $FinalDate
            Days_Remaining     = "$DaysLeft"
            Status_Description = "About to expire"
        }
    }
}
$testDetail | Where {
    $_.Days_Remaining -lt 30 -and
    $_.Usages -ne "" 
} | Export-Csv -NoTypeInformation -Path 'C:\SECnology\Data\Files\other1\Certificate_Status.csv'

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Что вам нужно сделать, это отфильтровать на основе свойства NotAfter.В зависимости от того, чего именно вы хотите достичь, может быть несколько вариантов:

# All certs which expiration date is before Friday, July 19, 2019 00:00:01
# This will include already expired certificates too
$_.NotAfter -le (Get-Date).Date.AddDays(30)

# All certs which expiration date is before Friday, July 19, 2019 00:00:00
# and after Wednesday, June 19, 2019 00:00:00
# This will include certificates that expired today
$_.NotAfter -le (Get-Date).Date.AddDays(30) -and $_.NotAfter -ge (Get-Date).Date

Общие принципы:

  1. Используйте -ge или -gt для указания даты начала.Разница только в том, хотите ли вы указать точную дату или нет (так, одна секунда разницы)
  2. Аналогично, используйте -le или -lt для указания даты окончания
  3. (Get-Date)покажет текущую дату и время, а (Get-Date).Date), сегодняшнюю дату в 00: 00: 00:
PS> Get-Date

Wednesday, June 19, 2019 12:16:57

PS> (Get-Date).Date

Wednesday, June 19, 2019 00:00:00

Как только вы уточните точные условия, используйте приведенные выше правила для построения вашего запроса идобавьте его к своему Where-Object как @ Ansgar , указанному в комментариях:

Where-Object {
  -not $_.PSIsContainer -and $_.NotAfter -le (Get-Date).Date.AddDays(30)
}
0 голосов
/ 19 июня 2019
$Date = ((Get-Date).addmonths(1)).adddays(-(Get-Date ((Get-Date).addmonths(1)) -format dd))
$Certs = Get-ChildItem -Path Cert:\LocalMachine\My\ | select *
foreach($Cert in $Certs){
    if($Cert.NotAfter -le $date -and $Cert.NotAfter -ge (Get-Date)){
        $Data =
        [PSCustomObject]@{
            Issuer             = $Cert.Issuer
            Expire_Date        = $Cert.NotAfter
            Days_Remaining     = (New-TimeSpan -Start (Get-Date) -End $($Cert.NotAfter)).Days
            Status_Description = "About to expire"
        }
    }
}

Быстрый маленький сценарий для вас, чтобы поиграть или получить идеи.Это может быть выполнено 1-го числа месяца, и вы получите сертификаты, срок действия которых истекает для этого месяца, независимо от того, имеет ли месяц 28, 30 или 31 день.

Решение состоит в том, что вы выбираете между датой выполненияи $ _. NotAfter с датой -le / ge.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...