現在の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 = "[email protected]"
$emailTo = "[email protected]"
$subject = "DFS Backlog Report"
$smtpServer = "MailServer"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $Emailbody)
これは1つの可能な解決策にすぎません。沢山あります。
[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 [email protected] -server mta.example.com -f [email protected] -subject "DFS Replication Report %DATE% %TIME:~0,5%"
これは、 GNU Unix Utils のhead
、cut
、tail
、およびblat
コマンドラインメーラー 。
また、dfsrdiag
ユーティリティ(サーバー上にある必要があります)を使用して、DFSRサービスから必要な統計を取得します。この例では、レプリケーショングループ名はAccountsであり、必要に応じてレプリケーショングループを設定/追加するように調整します。
これを電子メールで送信する1つの方法は、コンソール出力をファイルにリダイレクトすることです。
$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
次に、-Attachmentsパラメーターを使用してsend-mailmessageを使用します...ドキュメントは次のとおりです。
http://technet.Microsoft.com/en-us/library/dd347693.aspx
一般的な落とし穴:
私は解決策を考え出すために提供されたいくつかの答えを扱うことができました。重要なのは、書き込みホストをファイルにパイプできないことでした。次のコードを追加して、出力をメールの本文に直接書き込みます。チャームのように機能します。
$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)
Send-MailMessage
を使用するのが、おそらく最も簡単で最良の方法です。
以前のバージョンのPowerShellでは使用できないため、代わりに.NETメールオブジェクトを直接使用できます( http://vblog.strutt.org.uk/2011/09/sending-email-fromを参照) -powershell / 詳細)。