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
$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:
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
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
Awesome tool.
One thing, the export button doesn't bring out all the columns such as "Reason"
Thanks that should now be fixed
Cheers
Glen
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
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
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.
Great Script Glenn.
Thank you very much,
Federico
***** What a great Script, Glen ****
Thanks a lot
Bertrand
WOW a script that really kicks some serious tail!
Very nice, KUDO's!!
Excellent stuff, thank you!
Post a Comment