我有一个PowerShell脚本检查证书存储过期的证书。 它将在CLI中显示这些结果。 我想修改这个脚本,通过电子邮件的forms发送输出结果。 我知道如何通过PowerShell使用send-mailmessage CmdLet发送电子邮件,但我不确定如何获取脚本的结果并通过电子邮件发送。
这是脚本:
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,RequestType,NotAfter,CommonName,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结构来显示邮件中的输出。
更新由于您想以图像的formsembedded内联附件,因此我们不得不自己创build和发送电子邮件,而不是依赖于Send-MailMessage :
# Smtp details as outlined by Colyn1337 $smtpServer = "server.domain.com" $smtpFrom = "[email protected]" $smtpTo = "[email protected]" $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”
所以你已经完成了在$CertToList中生成你的列表的$CertToList 。 你可能在想如何做电子邮件,这是什么让你绊倒。 请记住,Powershell在那里让你的生活更轻松。 如果看起来太复杂,可能会有一个更简单的方法来做到这一点。 无论如何,你需要找出以下variables,并将其添加到您的代码:
$smtpServer = "server.domain.com" $smtpFrom = "[email protected]" $smtpTo = "[email protected]" $messageSubject = "The subject line of the email"
然后在代码的最后加上这一行:
Send-MailMessage -From "$smtpFrom" -To "$smtpTo" -Subject "$messageSubject" -Body "$($CertToList)" -SMTPServer "$smtpServer"
你会注意到我已经注意到你的$CertToListvariables以特殊的方式。 我已经这样做了,所以Powershell知道$ CertToList是一个variables,并将其内容拉入正文。 现在,你可以做任何你想要的身体,你可以这样做:
-Body "This email contains the cert list: `n`n $($CertToList)"