Как я могу использовать Powershell, чтобы узнать, когда истекает срок действия SSL-сертификата ТОЛЬКО для IIS для списка серверов из подразделения?

#powershell #ssl-certificate #iis-10

Вопрос:

У меня есть этот раздел кода, в котором, если я смогу просто заставить скрипт отвечать ТОЛЬКО с существующей темой (что указывает на сертификат IIS), тогда я смогу это сделать… (У меня есть перечисление подразделений, раздел «Вызов» и адрес электронной почты файла для планирования в задаче): [ПРИМЕЧАНИЕ: срок действия установлен на 500 дней, поэтому я могу использовать скрипт позже, чтобы просто найти определенное время истечения срока действия] [ПРИМЕЧАНИЕ 2: в моем профиле $день установлен на «$день = Формат даты получения yyyyMMdd»]

     $serverlist = $serverListpath.Name
    foreach($server in $serverlist){
        if($server -like '#*')
        {
            continue
        }
    
    $threshold = 500   #Number of days to look for expiring certificates
    $deadline = (Get-Date).AddDays($threshold)   #Set deadline date
    $p = ($c  /$server.count) * 100
     Write-Progress -Activity "Checking $._" -Status "$p % completed" -PercentComplete $p;
     if(Test-Connection -ComputerName $server -Count 2 -Quiet){
     #$server = "KnownIISServerHostname" #<-- to test with a hostname
    Invoke-Command -Verbose -ComputerName $server { Dir Cert:LocalMachineMy } |`
foreach {
    If ($_.NotAfter -le $deadline) { 
$_ | Select *| select PSComputerName, Subject, NotAfter, @{Label="Expires In (Days)";Expression={($_.NotAfter - (Get-Date)).Days}} }
    }|`
select PSComputerName,Subject, NotAfter, @{Label="Expires In (Days)";Expression={($_.NotAfter - (Get-Date)).Days}} |`
    export-csv -Force -Append -Encoding ASCII -NoTypeInformation .output$day-ExpiringIISSSLCerts.csv
    }
    }
 

Итак, где мне настроить это, чтобы в ответе были ТОЛЬКО существующие поля «Тема»; Не получать ответы с нулевой темой (которые являются сертификатами RDP)

Ответ №1:

Попробуйте использовать это:

 Import-Module WebAdministration
$CertAll=Get-ChildItem -Path Cert:LocalMachineMy
$CertInUse=Get-Childitem -Path IIS:SslBindings
$CertSame=Compare-Object -ReferenceObject $CertAll -DifferenceObject $CertInUse -Property ThumbPrint -IncludeEqual -ExcludeDifferent
$CertSame | foreach{Get-Childitem –path Cert:LocalMachineMy$($_.thumbprint)} | Select-Object -Property Subject, @{n=’ExpireInDays’;e={($_.notafter – (Get-Date)).Days}}
 

введите описание изображения здесь

Комментарии:

1. У вас все хорошо: на самом деле импорт не требуется при запуске «- RunAsAdministrator «во время » Команды вызова», поэтому нам не нужна «Веб-администрирование модуля импорта» в строке 1. Теперь, чтобы получить правильный синтаксис фильтра в «$CertSame «»GCI», и мы в золоте! 🙂

2. Я продолжал получать ошибки на $CertInUse — Это сработало-: ‘$CertInUse= Get-ChildItem -Путь IIS:SSLBindings’

3. А, вот и мы: ‘$CertInUse= (GCI IIS:SSLBindings)’

4. Я добавил «- Первый 1 » в самый конец и получил то, что мне было нужно

Ответ №2:

Поскольку в данном случае вас интересуют сертификаты IIS, я бы предложил использовать модуль IIS PowerShell, чтобы убедиться, что вы выбираете только те сертификаты, которые фактически используются IIS.

Ниже следует извлечь сертификаты, прикрепленные к сайтам с помощью HTTPS(SSL). В настоящее время у меня нет нескольких сайтов на одном сервере IIS для тестирования, но теоретически это должно найти их все, а не только «веб-сайт по умолчанию».

 $serverlist = $serverListpath.Name
foreach($server in $serverlist){
    if($server -like '#*')
    {
        continue
    }

$threshold = 500   #Number of days to look for expiring certificates
$deadline = (Get-Date).AddDays($threshold)   #Set deadline date
$p = ($c  /$server.count) * 100
 Write-Progress -Activity "Checking $._" -Status "$p % completed" -PercentComplete $p;
 if(Test-Connection -ComputerName $server -Count 2 -Quiet){
 #$server = "KnownIISServerHostname" #<-- to test with a hostname
 #Pull certificates from existing IIS bindings
 $certificates = Invoke-Command -Verbose -ComputerName $server { 
    Import-Module IISAdministration
    $sitebindings = Get-IISSite | foreach { Get-IISSiteBinding -Protocol HTTPS -Name $_ }
    $thumbprints = $sitebindings.Attributes | where {$_.Name -match "certificateHash"} | Select-Object -ExpandProperty Value
    $thumbprints | foreach {dir Cert:LocalMachineMy$_}
    }
$certificates |`
foreach {
    If ($_.NotAfter -le $deadline) { 
    $_ | Select *| select PSComputerName, Subject, NotAfter, @{Label="Expires In (Days)";Expression={($_.NotAfter - (Get-Date)).Days}} }
}|`
select PSComputerName,Subject, NotAfter, @{Label="Expires In (Days)";Expression={($_.NotAfter - (Get-Date)).Days}} |`
export-csv -Force -Append -Encoding ASCII -NoTypeInformation .output$day-ExpiringIISSSLCerts.csv
}
}
 

Комментарии:

1. Мы не можем точно «Установить-WindowsFeature web-mgmt-консоль» на каждом сервере IIS, что вам нужно сделать, чтобы загрузить «Администрирование IIS»… но спасибо…

2. @PatrickBurwell Действительно. У каждого своя ситуация, и я могу понять, что не все функции включены на каждом сервере. Рад, что вы смогли заставить решение работать.

Ответ №3:

#Завершите ЛОКАЛЬНЫЙ сценарий запуска. Вызовите это в команде вызова Foreach.

 $CertAll=GCI -Path Cert:LocalMachineMy
$CertInUse= (GCI IIS:SSLBindings)
$CertSame=Compare-Object -ReferenceObject $CertAll -DifferenceObject $CertInUse -Property ThumbPrint -IncludeEqual -ExcludeDifferent
#$CertSame=Compare-Object -ReferenceObject $CertAll -Property ThumbPrint -IncludeEqual -ExcludeDifferent
$CertSame | foreach{GCI -filter "" –path Cert:LocalMachineMy$($_.thumbprint)} | Select-Object -Property Issuer, @{n=’ExpireInDays’;e={($_.notafter – (Get-Date)).Days}} -First 1
 

Спасибо @bruce-zhang