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

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

$Date= (Get-Date)
$SMTPServer = "smtp.test.com" 
$From = "[email protected]"

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

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


person Didge    schedule 18.10.2017    source источник


Ответы (2)


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

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

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

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

пример:-

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

}

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

person Prasoon Karunan V    schedule 19.10.2017
comment
@Didge добавил пример - person Prasoon Karunan V; 20.10.2017
comment
Я получаю это сейчас. Извините за путаницу, сэр. Но я думаю, что не могу получить доступ к файлу IIS:\SslBindings. Я всегда получаю сообщение об ошибке Cannot find drive. A drive with the name 'IIS' does not exist. Это та часть, о которой я думаю, где я получил сообщение об ошибке: Get-ChildItem -Path IIS:\SslBindings - person Didge; 20.10.2017
comment
@Didge вам нужно импортировать модуль «WebAdministration» перед доступом к «IIS:\» - person Prasoon Karunan V; 21.10.2017
comment
@ PRASOON Да, это у меня есть. Тем не менее, я все еще получаю сообщение об ошибке. Нужно ли что-то менять в IIS? Кроме того, я запускаю ISE от имени администратора. :( - person Didge; 21.10.2017

@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 дней с текущей даты, и отправить уведомление по электронной почте. Я спрошу свою озабоченность по этому поводу в другом посте.

person Didge    schedule 06.11.2017