saída de e-mail do script do powershell

4

Eu encontrei este script maravilhoso que gera o status do atual backlog do DFS para o console do powershell. Isso funciona muito bem, mas eu preciso do script para me enviar e-mail para que eu possa agendar para ser executado todas as noites. Eu tentei usar o comando Send-MailMessage, mas não consigo fazê-lo funcionar. Principalmente porque minhas habilidades de powershell são muito fracas. Acredito que a maior parte do problema gira em torno do script usando o comando Write-Host. Enquanto a coloração é agradável eu prefiro que ela me envie os resultados. Eu também preciso que a solução seja capaz de especificar um servidor de e-mail, já que os servidores dfs não têm capacidade de e-mail.

Qualquer ajuda ou dicas são bem-vindas e apreciadas.

Aqui está o código.

$RGroups = Get-WmiObject -Namespace "root\MicrosoftDFS" -Query "SELECT * FROM DfsrReplicationGroupConfig"
$ComputerName=$env:ComputerName
$Succ=0
$Warn=0
$Err=0

foreach ($Group in $RGroups)
{
$RGFoldersWMIQ = "SELECT * FROM DfsrReplicatedFolderConfig WHERE     ReplicationGroupGUID='" + $Group.ReplicationGroupGUID + "'"
$RGFolders = Get-WmiObject -Namespace "root\MicrosoftDFS" -Query  $RGFoldersWMIQ
$RGConnectionsWMIQ = "SELECT * FROM DfsrConnectionConfig WHERE ReplicationGroupGUID='"+     $Group.ReplicationGroupGUID + "'"
$RGConnections = Get-WmiObject -Namespace "root\MicrosoftDFS" -Query  $RGConnectionsWMIQ
foreach ($Connection in $RGConnections)
{
$ConnectionName = $Connection.PartnerName.Trim()
if ($Connection.Enabled -eq $True)
{
if (((New-Object System.Net.NetworkInformation.ping).send("$ConnectionName")).Status -eq "Success")
{
foreach ($Folder in $RGFolders)
{
$RGName = $Group.ReplicationGroupName
$RFName = $Folder.ReplicatedFolderName

if ($Connection.Inbound -eq $True)
{
$SendingMember = $ConnectionName
$ReceivingMember = $ComputerName
$Direction="inbound"
}
else
{
$SendingMember = $ComputerName
$ReceivingMember = $ConnectionName
$Direction="outbound"
}

$BLCommand = "dfsrdiag Backlog /RGName:'" + $RGName + "' /RFName:'" + $RFName + "' /SendingMember:" + $SendingMember + " /ReceivingMember:" + $ReceivingMember
$Backlog = Invoke-Expression -Command $BLCommand

$BackLogFilecount = 0
foreach ($item in $Backlog)
{
if ($item -ilike "*Backlog File count*")
{
$BacklogFileCount = [int]$Item.Split(":")[1].Trim()
}
}

$Emailbody += "$BacklogFileCount files in backlog $SendingMember->$ReceivingMember for $RGName
"

} # Closing iterate through all folders
} # Closing  If replies to ping
} # Closing  If Connection enabled
} # Closing iteration through all connections
} # Closing iteration through all groups

$emailFrom = "[email protected]"
$emailTo = "[email protected]"
$subject = "DFS Backlog Report"
$smtpServer = "MailServer"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $Emailbody)
    
por Gordon Carlisle 12.04.2012 / 03:12

6 respostas

2

Se você quisesse sair do powershell, você poderia redirecionar a saída do script para um arquivo de texto e usar um mailer de linha de comando de terceiros como blat para enviar o arquivo de texto como o corpo (ou anexo) de um email e especifique o servidor smtp para saltar de.

    
por 12.04.2012 / 04:10
2

Esta é apenas uma solução possível; existem muitos.

[string]$emailBody = ""
$emailBody += "This is line 1<br />"
$emailBody += "This is line 2<br />"
$emailBody += "This is line 3<br />"
Send-MailMessage -From "$senderName <$senderAddr>" -To "$recptName <$recptAddr>" -Subject "$emailSubject" -Body $emailBody -SMTPServer $smtpServer -BodyAsHTML

Isso faz sentido?

    
por 12.04.2012 / 03:36
1

Minha solução não é bonita e não usa powershell, mas eu a uso há anos para fazer exatamente o que você está tentando alcançar.

@echo off
set s1=dfsrsrvr1
set s2=dfsrsrv2

set output=%TEMP%\dfsr.txt
echo DFS Replication Backlog Report>%OUTPUT%
echo.>>%OUTPUT%
echo For each DFS replicated share, any backlog is displayed below.>>%OUTPUT%
echo The first value is the backlog from %S2% to %S1%, the second value is the reverse>>%OUTPUT%
echo.>>%OUTPUT%

echo Accounts>>%OUTPUT%
echo ========>>%OUTPUT%
dfsrdiag backlog /rgname:Accounts /rfname:Accounts /sendingmember:%S2% /receivingmember:%S1% | head -n 2 | tail -n 1 | cut -d: -f2>>%OUTPUT%
dfsrdiag backlog /rgname:Accounts /rfname:Accounts /sendingmember:%S1% /receivingmember:%S2% | head -n 2 | tail -n 1 | cut -d: -f2>>%OUTPUT%

echo.>>%OUTPUT%

blat "%OUTPUT%" -to [email protected] -server mta.example.com -f [email protected] -subject "DFS Replication Report %DATE% %TIME:~0,5%"

Depende de head , cut e tail de GNU Unix Utils e blat mailer de linha de comando .

Ele também usa o utilitário dfsrdiag (que deve estar no seu servidor) para obter as estatísticas necessárias do serviço DFSR. No exemplo, o nome do grupo de replicação é Contas, ajuste para provar / adicionar mais grupos de replicação conforme necessário.

    
por 13.04.2012 / 17:10
0

Usar o Send-MailMessage é provavelmente a maneira mais fácil e melhor de prosseguir.

Ele não está disponível nas versões anteriores do PowerShell, portanto, como alternativa, você pode usar os objetos de email do .NET diretamente (consulte link para mais informações).

    
por 12.04.2012 / 12:33
0

Um método para enviar isso via e-mail seria redirecionar a saída do console para um arquivo:

$timeStamp = [DateTime]::Now.ToString("yyyyMMddHHmmss") #configure a timestamp variable
$attachFile = c:\temp\attach$timestamp.txt #configure txt file to which we'll redirect the console output.  Using the timestamp variable to generate a unique file name
Write-Host "Some output here" >> $attachFile

Em seguida, use send-mailmessage usando o parâmetro -Attachments ... a documentação está aqui:

link

Pegadinha comum:

  • A retransmissão do Exchange não está configurada para permitir o envio de e-mails da caixa que está executando o script
  • A proteção contra worms do antivírus em massa pode impedir e-mails com script
por 13.04.2012 / 16:58
0

Consegui trabalhar com várias das respostas fornecidas para encontrar uma solução. A chave era que você não pode canalizar um Write-Host para um arquivo. Eu adicionei o seguinte código para gravar a saída diretamente no corpo de um email. Funciona como um encanto.

$Emailbody += "$BacklogFileCount files in backlog $SendingMember->$ReceivingMember for $RGName
"
$emailFrom = "[email protected]"
$emailTo = "[email protected]"
$subject = "DFS Backlog Report"
$smtpServer = "MailServer"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $Emailbody)
    
por 13.04.2012 / 20:27