Сценарий 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 ответа
Приведенный выше скрипт никогда не работает, поскольку вы создаете переменные в отдельных сеансах на одном компьютере.
Вы можете сделать это двумя способами.
Создайте объект сеанса с целевым сервером один раз и используйте его повторно. Так что вы сможете получить переменные, определенные в сеансе в последующем
Invoke-command
казни.Без создания объекта сеанса, но путем выполнения всего на удаленном сервере в одном
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 дней с текущей даты, и отправить уведомление по электронной почте. Я спрошу мое беспокойство об этом в другом посте.