每个Exchange的管理员或者都遇到过这样的问题。对外,一般情况下,每家公司的邮件对外出口只有一个,这样比较容易管理,容易部署邮件防火墙,一般此类的防火墙都能提供邮件出入站的监控功能。可是针对内部邮件流我们没有办法知道,因为微软没提供此类的工具。如果没有此类数据的话,我们就无法准确的评估hub transport 服务器的负载和load balance是否工作正常。特别针对有多个site的情况下。
思路:我一直强调思路是因为,其实脚本很好写,脚本只是POWERSHELL的功能上的延伸。但是如果你没有思路,你将毫无头绪。言归正传,在Exchange2010的powershell里有没有针对邮件走向的查询命令呢,答案是肯定的,那就是: Get-MessageTrackingLog
A unique message tracking log exists on each computer that has the Hub Transport server role, the Mailbox server role, or the Edge Transport server role installed. The message tracking log is a comma-separated value (CSV) file that contains detailed information about the history of each e-mail message as it travels through an individual server.
经常使用powershell命令来管理exchange的同学对这个命令肯定不会陌生,我们经常使用这条命令来查询邮件从哪里来往哪里去。
比如
Get-MessageTrackingLog -Start "03/13/2010 09:00:00" -End "03/15/2010 17:00:00" -Sender [email protected]
(注意,默认情况下message tracking log 在hub server中只保留一个月时间,像这样查询去年的邮件是不可能的)
命令的意思是查询2010年3月13到15日之间,由[email protected]这个账号发出的邮件。 当然我们也可以加入其他参数来使查询更加准确。
Get-MessageTrackingLog [-DomainController <Fqdn>] [-End <DateTime>] [-EventId <String>] [-InternalMessageId <String>] [-MessageId <String>] [-MessageSubject <String>] [-Recipients <String[]>] [-Reference <String>] [-ResultSize <Unlimited>] [-Sender <String>] [-Server <ServerIdParameter>] [-Start <DateTime>]
这个命令功能看起来非常强大,我们可否利用它来查询邮件流?当然可以。 来看看我的思路吧,
前提: 1. 每封邮件都有唯一的MessageTrackingLog(以下简称MTL) 2. 发送给多人也只有一个MTL 3. 存在时间30天 如果我们把一天时间内,在这台hub服务器上发送和接收的所有邮件做个记数不就可以知道有多少邮件被发送和接收了么。 所有命令如下:
(Get-MessageTrackingLog –server $server -Start $yesterday -End $rundate -ResultSize unlimited -EventId send | Measure-Object).count
注意-enventid send 这个参数,表示所有发送的事件,如果不强调这个参数就是显示所有事件的邮件,一定要注意!
关键点:如何表示$yesterday这个变量。
$today = get-date
$rundate = (get-date).tostring("yyyy\-MM\-dd")
$yesterday = $($today.adddays(-1)).toshortdatestring()
大家可以试试以上这三个变量在PS里的结果有啥区别。
接下去就是定位$server,其实也很容易,大家还记得foreach这个工能吧? 可以将$servers = get-transportserver 输出的结果用foreach来循环。
$today = get-date
$rundate = (get-date).tostring("yyyy\-MM\-dd")
$yesterday = $($today.adddays(-1)).toshortdatestring()
$filedate = (get-date).tostring("yyyyMMdd_hhmmss")
$msg = "this script is running at $today"
$servers = get-transportserver
foreach ($server in $servers)
{
$send =(Get-MessageTrackingLog -server $server -Start $yesterday -End $rundate -ResultSize unlimited -EventId send | Measure-Object).count
$receive = (Get-MessageTrackingLog -server $server -Start $yesterday -End $rundate -ResultSize unlimited -EventId receive | Measure-Object).count
$msg = $msg + "
<br>$server sent $send emails, received $receive emails.</br>
"
}
# SMTP
$nSmtpserver = "自己填,下同"
$nFrom = ""
$nto = "
$nSubject = ""
# email report
send-mailmessage -bodyashtml -subject $nSubject -Smtpserver $nSmtpserver -From $nFrom -To $nTo -body $Msg
来看看输出的效果
还不错,当然还可以美化一下,外加归类。大家也可以看到在同一个SITE中的邮件流量基本相同,符合负载均衡的工作方式。