I've been looking at rewriting some message tracking scripts and one the things that's helpfull when you are doing message tracking is having some nice flashy visuals to help you out. Now there are some nice 3rd party packages out there like powergadgets who will separate you from your money and also the WPF framework stuff that give you some charting functionality. But if you want something that's free and will work from any workstation/server that has powershell and a Internet connection then its hard to go past Google Charts. Once you work you way around the different URL options its pretty much just a matter of creating some code to build the URL.
So to put this into something that is actually useful here's a couple of samples that first generate Rate information from the message tracking log files on Exchange 2003 using the wonder of WMI and on Exchange 2007 using the Exchange Management Shell get-messagetrackinglog cmdlet. The script itself is pretty simple it uses a hashtable to build this rate information then loops back though the hashtable to build a Google chart Url then it creates a Winform and adds a picture control setting the location property of the picture control to the URL that was built for Google charts. The cool thing is that's all you have to do because the picture control will handle all the http request stuff and download the png image and then display it to you how cool is that ! . Well I was pretty impressed anyway and you may see this technique popping up here a little more in the future.
I've put a sample of two scripts one for 2003 one for 2007 that shows a graph of the sent and received email for the last 6 hours. To use this script you need to set the hardcoded servername variable
$servername = "servername"
I've put a download of the code here the 2007 script looks like.
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
$servername = "servername"
$hcHourCount = @{ }
$dtQueryDT = [DateTime]::UtcNow.AddHours(-6)
$dtQueryDTf = [DateTime]::UtcNow
Get-MessageTrackingLog -Server $servername -ResultSize Unlimited -Start $dtQueryDT -End $dtQueryDTf -EventId "Send" | ForEach-Object{
$mdate = $_.TimeStamp
if ($hcHourCount.ContainsKey($mdate.hour)){
$hcHourCount[$mdate.hour] = [int]$hcHourCount[$mdate.hour] + 1
}
else{
$hcHourCount.Add($mdate.hour,1)
}
}
Get-MessageTrackingLog -Server $servername -ResultSize Unlimited -Start $dtQueryDT -End $dtQueryDTf -EventId "Receive" | ForEach-Object{
$mdate = $_.TimeStamp
if ($hcHourCount.ContainsKey($mdate.hour)){
$hcHourCount[$mdate.hour] = [int]$hcHourCount[$mdate.hour] + 1
}
else{
$hcHourCount.Add($mdate.hour,1)
}
}
$valueBlock = ""
$TitleBlock = ""
$lval = 0
$hcHourCount.GetEnumerator() | sort name -descending | foreach-object {
if ($lval -lt $_.value){$lval = $_.value}
if ($valueBlock -eq "") {$valueBlock = $_.value.ToString()}
else {$valueBlock = $valueBlock + "," + $_.value.ToString()}
if ($TitleBlock -eq ""){$TitleBlock = $_.key.ToString() + ":00"}
else {$TitleBlock = $_.key.ToString() + ":00" + "|" + $TitleBlock}
}
$hcHourCount
$csString = "http://chart.apis.google.com/chart?cht=bhg&chs=400x250&chd=t:" + $valueBlock + "&chds=0," + ($lval+20) + "&chxt=x,y&chxr=" + "&chxr=0,0," + ($lval+20) + "&chxl=1:|" + $TitleBlock + "&chco=00ff00&chtt=Message+Volume++Last+6+Hours"
$form = new-object System.Windows.Forms.form
$form.Text = "Last 6 Hours Graph"
#add Picture box
$pbox = new-object System.Windows.Forms.PictureBox
$pbox.Location = new-object System.Drawing.Size(10,10)
$pbox.Size = new-object System.Drawing.Size(400,250)
$pbox.ImageLocation = $csString
$form.Controls.Add($pbox)
$form.Size = new-object System.Drawing.Size(500,350)
$form.topmost = $true
$form.Add_Shown({$form.Activate()})
$form.ShowDialog()
So to put this into something that is actually useful here's a couple of samples that first generate Rate information from the message tracking log files on Exchange 2003 using the wonder of WMI and on Exchange 2007 using the Exchange Management Shell get-messagetrackinglog cmdlet. The script itself is pretty simple it uses a hashtable to build this rate information then loops back though the hashtable to build a Google chart Url then it creates a Winform and adds a picture control setting the location property of the picture control to the URL that was built for Google charts. The cool thing is that's all you have to do because the picture control will handle all the http request stuff and download the png image and then display it to you how cool is that ! . Well I was pretty impressed anyway and you may see this technique popping up here a little more in the future.
I've put a sample of two scripts one for 2003 one for 2007 that shows a graph of the sent and received email for the last 6 hours. To use this script you need to set the hardcoded servername variable
$servername = "servername"
I've put a download of the code here the 2007 script looks like.
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
$servername = "servername"
$hcHourCount = @{ }
$dtQueryDT = [DateTime]::UtcNow.AddHours(-6)
$dtQueryDTf = [DateTime]::UtcNow
Get-MessageTrackingLog -Server $servername -ResultSize Unlimited -Start $dtQueryDT -End $dtQueryDTf -EventId "Send" | ForEach-Object{
$mdate = $_.TimeStamp
if ($hcHourCount.ContainsKey($mdate.hour)){
$hcHourCount[$mdate.hour] = [int]$hcHourCount[$mdate.hour] + 1
}
else{
$hcHourCount.Add($mdate.hour,1)
}
}
Get-MessageTrackingLog -Server $servername -ResultSize Unlimited -Start $dtQueryDT -End $dtQueryDTf -EventId "Receive" | ForEach-Object{
$mdate = $_.TimeStamp
if ($hcHourCount.ContainsKey($mdate.hour)){
$hcHourCount[$mdate.hour] = [int]$hcHourCount[$mdate.hour] + 1
}
else{
$hcHourCount.Add($mdate.hour,1)
}
}
$valueBlock = ""
$TitleBlock = ""
$lval = 0
$hcHourCount.GetEnumerator() | sort name -descending | foreach-object {
if ($lval -lt $_.value){$lval = $_.value}
if ($valueBlock -eq "") {$valueBlock = $_.value.ToString()}
else {$valueBlock = $valueBlock + "," + $_.value.ToString()}
if ($TitleBlock -eq ""){$TitleBlock = $_.key.ToString() + ":00"}
else {$TitleBlock = $_.key.ToString() + ":00" + "|" + $TitleBlock}
}
$hcHourCount
$csString = "http://chart.apis.google.com/chart?cht=bhg&chs=400x250&chd=t:" + $valueBlock + "&chds=0," + ($lval+20) + "&chxt=x,y&chxr=" + "&chxr=0,0," + ($lval+20) + "&chxl=1:|" + $TitleBlock + "&chco=00ff00&chtt=Message+Volume++Last+6+Hours"
$form = new-object System.Windows.Forms.form
$form.Text = "Last 6 Hours Graph"
#add Picture box
$pbox = new-object System.Windows.Forms.PictureBox
$pbox.Location = new-object System.Drawing.Size(10,10)
$pbox.Size = new-object System.Drawing.Size(400,250)
$pbox.ImageLocation = $csString
$form.Controls.Add($pbox)
$form.Size = new-object System.Drawing.Size(500,350)
$form.topmost = $true
$form.Add_Shown({$form.Activate()})
$form.ShowDialog()