Вывод по электронной почте скрипта powershell

Я нашел этот замечательный скрипт, который выводит статус текущего журнала DFS на консоль PowerShell. Это прекрасно работает, но мне нужен сценарий для отправки мне по электронной почте, чтобы я мог запланировать его запуск ночью. Я пытался использовать команду Send-MailMessage, но не могу заставить ее работать. Главным образом потому, что мои навыки PowerShell очень слабы. Я полагаю, что большая часть проблемы вращается вокруг сценария с помощью команды Write-Host. Хотя окраска хорошая, я бы предпочел, чтобы она пришла мне по электронной почте. Мне также нужно решение, чтобы иметь возможность указать почтовый сервер, поскольку серверы DFS не имеют возможности электронной почты.

Любая помощь или советы приветствуются и приветствуются.

Вот код

$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 = "sender@foobar.com"
$emailTo = "recipient@foobar.com"
$subject = "DFS Backlog Report"
$smtpServer = "MailServer"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $Emailbody)

6 ответов

Это всего лишь одно из возможных решений; Здесь очень много.

[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

Имеет ли это смысл?

Если вы хотите перейти из PowerShell, вы можете перенаправить вывод сценария в текстовый файл и использовать стороннюю программу для работы с командной строкой, такую ​​как blat, чтобы отправить текстовый файл в качестве тела (или вложения) электронного письма и указать smtp. сервер, чтобы отскочить от.

Мое решение не очень красивое и не использует PowerShell, но я использую его годами, чтобы делать именно то, что вы пытаетесь достичь.

@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 logs@example.com -server mta.example.com -f user@example.com -subject "DFS Replication Report %DATE% %TIME:~0,5%"

Опирается на head, cut а также tail из GNU Unix Utils и blat почтовая программа командной строки.

Он также использует dfsrdiag утилита (которая должна быть на вашем сервере), чтобы получить необходимую статистику от службы DFSR. В этом примере имя группы репликации - "Учетные записи", настройте по вкусу / добавьте дополнительные группы репликации по мере необходимости.

Мне удалось поработать с несколькими из предоставленных ответов, чтобы найти решение. Ключ был в том, что вы не можете передать Write-Host в файл. Я добавил следующий код, чтобы записать вывод непосредственно в тело письма. Работает как шарм.

$Emailbody += "$BacklogFileCount files in backlog $SendingMember->$ReceivingMember for $RGName
"
$emailFrom = "sender@foobar.com"
$emailTo = "recipient@foobar.com"
$subject = "DFS Backlog Report"
$smtpServer = "MailServer"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $Emailbody)

С использованием Send-MailMessage вероятно, самый простой и лучший способ продолжить.

Он недоступен в более ранних версиях PowerShell, поэтому в качестве альтернативы вы можете напрямую использовать почтовые объекты.NET (см. http://vblog.strutt.org.uk/2011/09/sending-email-from-powershell/ для больше информации).

Одним из способов отправки этого по электронной почте будет перенаправление вывода консоли в файл:

$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

Затем используйте send-mailmessage, используя параметр -Attachments... документация находится здесь:

http://technet.microsoft.com/en-us/library/dd347693.aspx

Общие гоча:

  • Ретранслятор Exchange не настроен на отправку писем из ящика, на котором запущен скрипт
  • Антивирусная защита от массовой почтовой рассылки может предотвратить появление скриптовых писем
Другие вопросы по тегам