Thursday, October 18, 2007

Exchange 2007 Content Agent Log Message Tracker Gui

One of the cool features from a logging perspective on Exchange 2007 is the ability to log the SCL of every message when you have the Content Filtering Agent enabled (and also logging enabled). There is a Exchange Management Shell powershell cmdlet for reading these logs called get-agentlog which gives a good cmdline experience but as these logs are something you might want to check on a regular basis and the information contained in them is a little unwieldy to display in a cmdline environment I decided to put together a little GUI to make my life a little easier. I based the GUI on my Exchange 2000/3 WMI message tracker and I was able to carry over a lot of the cool little aggregation functions of this utility using most of the same code with a few tweaks here and there.

What this script does is creates a Winform and adds a whole bunch of controls to that winform such as datapickers, textboxes, checkboxes,labels and buttons. Its then wires ups some functions to the button clicks so that when you click the search button in will run the get-agentlog cmdlet with parameters for the daterange you specified in the GUI. To make sure you only get the events in the log that relate to the content filter it use a filter $_.agent -eq "Content Filter Agent”

The data returned by get-agent log is then added to a ADO.NET data table which is then data bound to a datagridview to display back in the form. Clicking the export button will fire a save-file dialogue box and some code will then export the table results to a csv file.

There are textboxes to allows you to search based on the from and/or To address.

There is a drop down list to allow you to select a SCL level to look at so you can choose to filter by only messages that have been assigned a specific SCL value.

The Extra sections has the aggregate options currently it has four aggregate option is can aggregate

By SCL this shows you by SCL Value how many messages where received between the dates specified

By Receiver will show you grouped by receiver how many messages have been received for each SCL value

By Sender will show you grouped by Sender(P1) how many messages have been received for each SCL value

By Date will show you by Date how many messages have been received for each SCL value.

Currently the script is only designed to be run locally on the Exchange box where the agent logs files are located. The Get-agentlog cmdlet doesn’t have a server parameter although it does have a log file location parameter so this maybe an option if you did want to run this script from a machine other then the Local Exchange server. To run the script is basically straight forward when you run it the script will build the winform and should then present this as an active window. Select the date you want to scan and the click the search button.

This is really only kind of scratching the surface of what you could do with the agent logs im working on a geolcation version so I can show the country origins of SCL values and also a version that will integrated the message tracking logs so I can include subject information in with the SCL. Also there is a lot more then just the content filtering information stored in the agent logs other things such as RBL use and effectiveness can be reported and other Transport agents that log to these files.

I’ve put a download of the code here It’s a bit to large to past verbaitem in the blog the main get-aglog section looks like

$filter = "$_.agent -eq ""Content Filter Agent"""
$dtQueryDT = New-Object System.DateTime $dpTimeFrom.value.year,$dpTimeFrom.value.month,$dpTimeFrom.value.day,$dpTimeFrom2.value.hour,$dpTimeFrom2.value.minute,$dpTimeFrom2.value.second
$dtQueryDTf = New-Object System.DateTime $dpTimeFrom1.value.year,$dpTimeFrom1.value.month,$dpTimeFrom1.value.day,$dpTimeFrom3.value.hour,$dpTimeFrom3.value.minute,$dpTimeFrom3.value.second
if ($extrasettings -eq 0){
get-agentlog -StartDate $dtQueryDT -EndDate $dtQueryDTf | where {$filter} | ForEach-Object {
$exclude = 0
if ($sclFilterboxCheck.Checked -eq $true -band $_.ReasonData -ne $sclFilterboxDrop.SelectedItem){$exclude = 1}
$repstring = ""
$incRec = $false
$p2string = [string]::join(" , ", $_.P2FromAddresses)
$repstring = [string]::join(" , ",$_.Recipients)
if ($snSenderAddressTextBox.text -ne ""){
if ($snSenderAddressTextBox.text.ToString().ToLower() -eq $_.P1FromAddress.ToString().ToLower()){
$incRec = $true
}
}
else {
if ($snRecipientAddressTextBox.text.ToString().ToLower() -ne ""){
if ($repstring -match $snRecipientAddressTextBox.text.ToString().ToLower()){
$incRec = $true
}
}
else{$incRec = $true}
}
if ($incRec -eq $true -band $exclude -eq 0){$ssTable.Rows.Add($_.Timestamp,$_.P1FromAddress,$p2string,$repstring,$_.Action,$_.Reason,$_.ReasonData)}
}
$dgDataGrid.DataSource = $ssTable}
else{
get-agentlog -StartDate $dtQueryDT -EndDate $dtQueryDTf | where {$filter} | ForEach-Object {
if ($GroupbySCL.Checked -eq $true){
[String]$sclival = "SCL " + $_.ReasonData
if ($sclhash.ContainsKey($sclival)){
$tsize = [int]$sclhash[$sclival] + 1
$sclhash[$sclival] = $tsize
}
else{
$sclhash.add($sclival,1)
}

}
if ($GroupByReciever.Checked -eq $true){
foreach($recp in $_.Recipients){
$sclagkey = $recp.ToString().replace("|","-") + "|" + $_.ReasonData
AggResults($sclagkey)
}

}
if ($GroupBySender.Checked -eq $true){
$sclagkey = $_.P1FromAddress.ToString().replace("|","-") + "|" + $_.ReasonData
AggResults($sclagkey)
}
if ($GroupByDate.Checked -eq $true){
$sclagkey = $_.Timestamp.toshortdatestring().replace("|","-") + "|" + $_.ReasonData
AggResults($sclagkey)
}

}

foreach($sclval in $sclhash.keys){
$sclTable.rows.add("",$sclval,$sclhash[$sclval])
}
foreach($adr in $gbhash1.keys){
$daDatarray = $adr.split("|")
$sclTable.rows.add($daDatarray[0],$daDatarray[1],$gbhash1[$adr])
}
$dgDataGrid.DataSource = $sclTable


}
}


11 comments:

Jon said...

I know nothing about PowerShell. Trying to use this script, PowerShell spits this error when I click Search:

The term 'get-agentlog' is not recognized as a cmdlet, funciton, operable program, or script file. Verify the term and try again. At C:\cagentTracker.ps1:43 char: 14

Glen said...

Get-agentlog is a Exchange Management Shell cmdlet so this script needs to be run from within the Exchange Management shell on the Exchange Server where you have logging enabled. (That error sounds like you just trying to run it from Powershell which wont work)

cheers
Glen

Anonymous said...

Awesome tool.

One thing, the export button doesn't bring out all the columns such as "Reason"

Glen said...

Thanks that should now be fixed

Cheers
Glen

Chris Mace said...

What command are you guys typing to get the desired outcome. When I type in the get-agentlog command it doesnt populate a gui, it just executes a ton of entries from the agent log file.

THanks
Chris Mace

Glen said...

This is a script that uses Get-Agentlog logs to produce a GUI. Get-agentlog itself will just show you the output of the Log file which while usefull is much help hence i built a GUI to show this information in a filter format. You need to download and run the script if you want to see the information in this way.

cheers
Glen

JJB said...

Thanks Thanks Thanks!!!!
I'm sure you spent allot of time on this. I don't understand why Microsoft didn't build somthing like this in. This is most helpfull script I have found.

Federico said...

Great Script Glenn.

Thank you very much,
Federico

Anonymous said...

***** What a great Script, Glen ****
Thanks a lot
Bertrand

Anonymous said...

WOW a script that really kicks some serious tail!

Very nice, KUDO's!!

Anonymous said...

Excellent stuff, thank you!