Resultados de email do Script do PowerShell

3

Eu tenho um script powershell que verifica se o certificado armazena certificados expirados. Ele exibirá esses resultados dentro do CLI. Eu quero modificar este script para enviar por e-mail os resultados da saída no corpo do email. Eu sei como enviar um e-mail através do PowerShell usando a CmdLet send-mailmessage, mas não tenho certeza sobre como obter os resultados do script e enviá-lo por e-mail ...

Aqui está o script:

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
    
por DangeRuss 10.07.2014 / 21:00

2 respostas

4

Como a formatação de saída no prompt do PowerShell acontece quando você realmente gera $CertToList , e você não está interessado nisso, você pode querer construir uma estrutura HTML para apresentar a saída na mensagem de correio.

Atualizar Como você deseja incorporar um anexo in-line na forma de uma imagem, teremos que fazer o trabalho de criar e enviar o email por nós mesmos, em vez de confiar em 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)

Se você quiser usar um arquivo .jpeg ou .jpg em vez do PNG, altere o MimeType de "image / png" para "image / jpeg"

    
por 10.07.2014 / 21:38
4

Você já fez a parte difícil de gerar sua lista em $CertToList . Você provavelmente está pensando em como fazer o e-mail e é isso que está te enganando. Lembre-se, o Powershell está lá para tornar sua vida mais fácil. Se parece muito complicado, há provavelmente uma maneira mais fácil de fazer isso. De qualquer forma, você precisa descobrir as seguintes variáveis e adicioná-las ao seu código:

$smtpServer = "server.domain.com"
$smtpFrom = "[email protected]"
$smtpTo = "[email protected]"
$messageSubject = "The subject line of the email"

Em seguida, adicione esta linha no final do seu código:

Send-MailMessage -From "$smtpFrom" -To "$smtpTo" -Subject "$messageSubject" -Body "$($CertToList)" -SMTPServer "$smtpServer"

Você notará que sua variável $CertToList foi anotada de maneira especial. Eu fiz isso para que o Powershell saiba com certeza que o $ CertToList é uma variável e puxe seu conteúdo para o corpo. Agora, você pode fazer o corpo como quiser, você pode fazer algo como:

-Body "This email contains the cert list: 'n'n $($CertToList)"
    
por 10.07.2014 / 21:24