如何按过期天数排序SSO ADFS证书到期检测邮件列表?
调整ADFS证书到期检测脚本,按过期天数从多到少排序
以下是修改后的脚本,实现按证书过期相关天数从多到少排序(未过期的按剩余天数降序,已过期的按已过期天数降序,数值大的排在前面):
Clear $Body = "<b>SSO Certificate Expiration:</b><br/>" $ExpirationThreshold = 30 $CurrentDate = Get-Date $ComparisonDate = $CurrentDate.AddDays($ExpirationThreshold) # 获取信任关系并计算排序所需的属性 $Trusts = Get-AdfsClaimsProviderTrust | ForEach-Object { # 获取每个信任的最新令牌签名证书过期日期 $latestCertExpDate = $_.TokenSigningCertificates.NotAfter | Group-Object Name | ForEach-Object { $_.Group | Sort-Object | Select-Object -Last 1 } # 计算天数:未过期为剩余天数,已过期为已过期天数 $relatedDays = if ($latestCertExpDate -ge $CurrentDate) { ($latestCertExpDate - $CurrentDate).Days } else { ($CurrentDate - $latestCertExpDate).Days } # 输出包含所有必要属性的自定义对象 [PSCustomObject]@{ Name = $_.Name CertExpirationDate = $latestCertExpDate RelatedExpirationDays = $relatedDays IsExpired = $latestCertExpDate -lt $CurrentDate } } | Sort-Object -Property RelatedExpirationDays -Descending # 按天数从多到少排序 # 构建邮件内容 foreach ($Trust in $Trusts) { if (-not $Trust.CertExpirationDate) { continue } if (-not $Trust.IsExpired -and $Trust.CertExpirationDate -lt $ComparisonDate) { $Body += "$($Trust.Name) cert expiring in: <b style='background-color:yellow'>$($Trust.RelatedExpirationDays)</b> days<br/>" } elseif ($Trust.IsExpired) { $Body += "$($Trust.Name) already expired (<b style='color:red'>$($Trust.RelatedExpirationDays)</b> days ago)<br/>" } } $Body += "<br/><br/><i>This Script Was Run From: $env:COMPUTERNAME</i>" Write-Host "Sending Email" Send-MailMessage -SmtpServer "*****" -Body $Body -Credential $PSCredSG -From "*****" -To "*****" -Subject "Expiring SSO Certs" -BodyAsHtml
核心修改说明:
- 保留日期类型并计算排序字段:不再将证书过期日期转为字符串,而是直接存储
DateTime对象,同时新增RelatedExpirationDays字段存储剩余天数或已过期天数,为排序提供可靠数值依据 - 替换排序逻辑:移除原有的按名称排序,改为按
RelatedExpirationDays降序排序,确保天数多的条目排在前面 - 优化邮件内容构建:新增
IsExpired字段简化条件判断,避免重复的日期比较操作,提升脚本可读性
内容的提问来源于stack exchange,提问作者lexii0505
相关产品推荐
相关产品推荐

