Сценарий Powershell для удаленного поиска связанных с истекающим сроком сертификатов в IIS

В настоящее время я работаю над сценарием, который будет отправлять электронное письмо, как только срок действия сертификатов, связанных с IIS моих веб-серверов, приближается. У меня есть сценарий, чтобы отправить его по электронной почте. Все, что мне нужно знать, это как сравнить сертификаты, доступные в запросе магазина, с сертификатами, которые используются в настоящее время. На данный момент вот что у меня есть:

$Date= (Get-Date)
$SMTPServer = "smtp.test.com" 
$From = "testmail@noreply.com"

Import-Module WebAdministration

$Servers = @("WEBSERVER1", "WEBSERVER2")

$certificates = foreach($server in $Servers){
    Invoke-Command -ComputerName $server -ScriptBlock { $CertAll = Get-ChildItem -Path Cert:\LocalMachine\My }
    Invoke-Command -ComputerName $server -ScriptBlock { $CertInUse = Get-ChildItem -Path IIS:\SslBindings }
    Invoke-Command -ComputerName $server -ScriptBlock { $CertSame = Compare-Object -ReferenceObject $CertAll -DifferenceObject $CertInUse -Property Thumbprint -IncludeEqual -ExcludeDifferent }

    Invoke-Command -ComputerName $server -ScriptBlock { $cert = $CertSame | ForEach {Get-ChildItem -Path Cert:\LocalMachine\My\$($_.thumbprint)} | 
  Select-Object Subject, DaysUntilExpired, NotAfter, @{n='ExpireInDays';e={($_.notafter - ($Date)).Days}}}
}

    $certificates | Sort DisplayName

Любая помощь и предложение будут оценены. Спасибо!

2 ответа

Решение

Приведенный выше скрипт никогда не работает, поскольку вы создаете переменные в отдельных сеансах на одном компьютере.

Вы можете сделать это двумя способами.

  1. Создайте объект сеанса с целевым сервером один раз и используйте его повторно. Так что вы сможете получить переменные, определенные в сеансе в последующем Invoke-command казни.

  2. Без создания объекта сеанса, но путем выполнения всего на удаленном сервере в одном Invoke-Command,

пример:-

Invoke-command -computerName $Server {
    $CertAll = ....
    $CertInUse = ....
    $CertSame = ....
    $cert = $CertSame | ForEach ..... |
    Select-Object Subject, DaysUntilExpired .....

}

если у вас нет никаких дальнейших действий на удаленном сервере после определения срока действия сертификатов, я бы предложил использовать второй вариант.

@PRASOON Мне уже удалось проверить свои сертификаты удаленно. Я пытаюсь работать с различными ссылками, которые я нашел в Google. Во всяком случае, вот сценарий.

$Date = Get-Date
$servers = Get-Content C:\servers.txt

$cert = Foreach ($server in $servers) {
    Invoke-Command -ComputerName $server -ScriptBlock{
        Import-Module WebAdministration; Get-ChildItem -Path IIS:SslBindings | ForEach-Object -Process{
            if ($_.Sites)
                {
                    $certificate = Get-ChildItem -Path CERT:LocalMachine\My |
                        Where-Object -Property Thumbprint -EQ -Value $_.Thumbprint

                    [PSCustomObject]@{
                        Sites = $_.Sites.Value
                        DnsNameList = $certificate.DnsNameList
                        NotAfter = $certificate.NotAfter
                        ExpireInDays = ($certificate.NotAfter - (Get-Date)).Days}
                }
            } 
        }
    } 

$cert | Select PSComputerName, DnsNameList, NotAfter, ExpireInDays | Where-Object {$_.ExpireInDays -lt 30} | Out-File C:\results.txt

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

Другие вопросы по тегам