当 PSCustomObject 返回的 ExpiryInDays 数据小于或等于 30 时,在 PowerShell 中触发电子邮件警报

Trigger an email alert in PowerShell when ExpiryInDays data returned by PSCustomObject is less than or equal to 30

我这里有一个脚本,它将 return 从不同 Web 服务器的 IIS 中绑定的证书中获取我需要的信息。

$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

这是记事本中的输出结果:

PSComputerName    DnsNameList    NotAfter                ExpireInDays
--------------    -----------    --------                ------------
ComputerName      {URL.com}      1/1/2050 11:59:59 PM           11744

它 return 是一长串带有支持详细信息的证书。我需要做的是将 certificate\s 的详细信息 is\are 在 30 天内过期到另一个 TXT 文件中,以便我解析内容或将文件本身附加到电子邮件通知中。

如果您认为还有更多其他方法可以解决或简化此脚本,我非常愿意接受建议。提前致谢。

试试这样的东西,它取自我用于类似任务的脚本:

# Note: It's usually better to filter with Where-Object and then Select-Object
$ExpiringCerts = $cert | Where-Object { $_.ExpireInDays -lt 30 } | Select-Object -Properties PSComputerName, DnsNameList, NotAfter, ExpireInDays;

if ($ExpiringCerts) {
    $MailSettings = @{
        SmtpServer = 'smtp.example.com';
        Port = 25;
        UseSsl = $false;
        Subject = 'Subject Line';
        To = 'to@example.com','other@example.com'
        From = 'from@example.com';
        Body = $ExpiringCerts | ConvertTo-Html -As Table -Fragment | Out-String;
        BodyAsHtml = $true;
    };

    Send-MailMessage @MailSettings;
}

如果您确实需要将结果作为文件附件,则可以将输出保存到文件中并在 Send-MailMessage 上使用 -Attachment 参数。但是,通常对于此类通知,使用电子邮件正文更有意义。