我有一个power
shell脚本,用于检查证书存储区是否存在过期证书.它将在CLI中显示这些结果.我想修改此脚本以通过电子邮件发送电子邮件正文中的输出结果.我知道如何使用send-mailmessage CmdLet通过Power
Shell发送电子邮件,但我不确定如何获取脚本的结果并将其发送到电子邮件中…
这是脚本:
param([int]$InNumberOfDays=180,[switch]$ExcludeAutoEnroll) function WriteCertInfo($cert) { #just a lot of code to get the fields into an object $certObj = "" | Select RequesterName,RequestType,ExpirationDate,CommonName,EnrollmentFlags $RequesterName=$cert -match "Requester Name:.*Request Type:" $startLength="Requester Name:".Length $lineLength=$matches[0].Length -("Request Type:".Length + $startLength) $OutRequesterName=$matches[0].SubString($startLength,$lineLength) $certObj.RequesterName=$OutRequesterName $RequestType=$cert -match "Request Type:.*Certificate Expiration Date:" $startLength="Request Type:".Length $lineLength=$matches[0].Length - ("Certificate Expiration Date:".Length + $startLength) $OutRequestType=$matches[0].SubString($startLength,$lineLength) $certObj.RequestType=$OutRequestType $ExpirationDate = $cert -match "Certificate Expiration Date:.*Issued Common Name:" $startLength="Certificate Expiration Date:".Length $lineLength=$matches[0].Length - ("Issued Common Name:".Length + $startLength) $OutExpirationDate=$matches[0].SubString($startLength,$lineLength) $certObj.ExpirationDate=$OutExpirationDate $IssuedCommonName= $cert -match "Issued Common Name:.*Template Enrollment Flags:" $startLength="Issued Common Name:".Length $lineLength=$matches[0].Length - ("Template Enrollment Flags:".Length + $startLength) $OutCommonName=$matches[0].SubString($startLength,$lineLength) $certObj.CommonName=$OutCommonName $EnrollmentFlags= $cert -match "Template Enrollment Flags:.*" $startLength="Template Enrollment Flags:".Length $lineLength=$matches[0].Length - ($startLength) $OutEnrollmentFlags=$matches[0].SubString($startLength,$lineLength) $certObj.EnrollmentFlags=$OutEnrollmentFlags if($ExcludeAutoEnroll) { if(($OutEnrollmentFlags -match "CT_FLAG_AUTO_ENROLLMENT") -eq $false) { $script:CertToList+=$certObj } } else { $script:CertToList+=$certObj } } $CertToList=@() $today=Get-Date $endperiod=$today.AddDays($InNumberOfDays) $tester=certutil -view -restrict "NotAfter>=$today,NotAfter<=$endperiod" -out "RequestID,RequesterName,NotAfter,EnrollmentFlags" $arr=$tester -match "Row \d*:" $numberOfCerts=$arr.length $line=[string]::join(" ",$tester) for($certNo=0;$certNo -lt $numberOfCerts;$certNo=$certNo+1) { $r1=$arr[$certNo] if($certNo -ne ($numberOfCerts-1)) { $r2=$arr[$certNo+1] } else { $r2="Maximum Row Index" } $isFound=$line -match "$r1 .* $r2" $NumberOfChars=$matches[0].Length - $r2.Length $thisCert=$matches[0].SubString(0,$NumberOfChars) WriteCertInfo($thisCert) } $CertToList
由于PowerShell提示符中的输出格式化在您实际输出$CertToList时发生,并且您对此不感兴趣,因此您可能希望构造一个HTML结构以在邮件消息中显示输出.
更新
由于您希望以图像的形式嵌入内联附件,因此我们必须自己创建和发送电子邮件,而不是依赖于Send-MailMessage:
# Smtp details as outlined by Colyn1337 $smtpServer = "server.domain.com" $smtpFrom = "emailfrom@address.com" $smtpTo = "emailto@address.com" $messageSubject = "The subject line of the email" # Set up an SmtpClient for sending the message $smtpClient = New-Object Net.Mail.SmtpClient $smtpClient.Host = $smtpServer # Create the MailMessage you want to send $mailMessage = New-Object Net.Mail.MailMessage $mailMessage.From = $smtpFrom $mailMessage.To.Add($smtpTo) $mailMessage.Subject = $messageSubject # Create the html content for the mail # Add embedded image resource to HTML $htmlReport = "<image src=cid:DangeRusslogo>" # And then the table with your data $htmlReport += "<table>" $htmlReport += "`n" $htmlReport += "<tr>" $htmlReport += "<th>RequestID</th>" $htmlReport += "<th>RequesterName</th>" $htmlReport += "<th>RequestType</th>" $htmlReport += "<th>NotAfter</th>" $htmlReport += "<th>CommonName</th>" $htmlReport += "<th>EnrollmentFlags</th>" $htmlReport += "</tr>" $htmlReport += "`n" foreach($cert in $CertToList) { $htmlReport += "<tr>" $htmlReport += "<td>$($cert.RequestID)</td>" $htmlReport += "<td>$($cert.RequesterName)</td>" $htmlReport += "<td>$($cert.RequestType)</td>" $htmlReport += "<td>$($cert.NotAfter)</td>" $htmlReport += "<td>$($cert.CommonName)</td>" $htmlReport += "<td>$($cert.EnrollmentFlags)</td>" $htmlReport += "</tr>" $htmlReport += "`n" } $htmlReport += "</table>" # Now create an AlternateView from the HTML contents $messageBody = [Net.Mail.AlternateView]::CreateAlternateViewFromString($htmlReport,'text/html') # Create a Linked Resource from the logo image $imageMimeType = New-Object System.Net.Mime.ContentType("image/png") $embeddedImage = New-Object Net.Mail.LinkedResource("C:\Users\DangeRuss\logo.png",$imageMimeType) $embeddedImage.ContentId = "DangeRusslogo" # Add the resource to the HTML view $messageBody.LinkedResources.Add($embeddedImage) # Add the HTML view to the MailMessage $mailMessage.AlternateViews.Add($messageBody) # And finally send the message $smtpClient.Send($mailMessage)
如果要在PNG上使用.jpeg或.jpg文件,请将MimeType从“image / png”更改为“image / jpeg”