functions/Update-IISCertificates.ps1

function Update-IISCertificates {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [string]$OldThumbprint,

        [Parameter(Mandatory=$true)]
        [string]$NewThumbprint
    )

    if ($PSVersionTable.PSVersion.Major -eq 7) {
        throw "Update-IISCertificates does not work in Powershell 7 reliable, yet!"
    }

    $currentFriendlyName = Get-CertificateFriendlyName -Thumbprint $OldThumbprint
    $newFriendlyName = Get-CertificateFriendlyName -Thumbprint $NewThumbprint

    if ($currentFriendlyName -ne $newFriendlyName) {
        throw "New certificate $($Thumbprint) FriendlyName '$($newFriendlyName)' does not match $($currentThumbprint) FriendlyName '$($currentFriendlyName)'!"
        return $false
    }

    while (Get-Module -Name WebAdministration) {
        Remove-Module -Name WebAdministration
    }
    Import-Module WebAdministration -WarningAction SilentlyContinue
    
    [int]$updatedBindings = 0
    [int]$updateErrors = 0

    $websites = Get-Website
    if (-not $websites)
    {
        Write-Warning "Unable to find IIS websites!"
        return $false
    }
    foreach ($website in $websites)
    {
        $websiteName = $website.Name
        $bindings = Get-WebBinding -Name $websiteName -Protocol https | Where-Object { $_.certificateHash -eq $OldThumbprint }
        if ($bindings)
        {
            Write-Host "Update $websiteName"
            foreach ($binding in $bindings)
            {
                try {
                    $parts = $($binding.bindingInformation) -split ":", 3
                    $ip = $parts[0]
                    $port = $parts[1]
                    $hostHeader = $parts[2]
                    Write-Host "Update $($binding.bindingInformation)"
                    Write-Host "Set-IISCertificateNew -CertThumbprint $NewThumbprint -SiteName $websiteName -Port $port -IPAddress $ip -HostHeader $hostHeader -RequireSNI -RemoveOldCert"
                    Set-IISCertificate -CertThumbprint $NewThumbprint -SiteName $websiteName -Port $port -IPAddress $ip -HostHeader $hostHeader -RequireSNI -RemoveOldCert
                    $updatedBindings++
                } catch {
                    Write-Error "Failed to update binding $($binding.bindingInformation) for website $($websiteName)!"
                    $updateErrors++
                }
            }
        }
    }

    Write-Verbose "Updated $updatedBindings website bindings."
    return ($updateErrors -eq 0)
}