#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