[Powershell Script] Message Tracking on multiple Hub Transport Server

Message Tracking in a large exchange environment is a tiring job, you will have to search message on each hub transport server one by one, to make this easy for myself I wrote this script function for myself, please feel free to leave your comments and feedback.

(.) dot source the script in your PowerShell session to import the function

Example:

. .\Get-MessageTrace.ps1

Example 1 -: Track Message based on Sender and Recipient

POWERSHELL
Get-MessageTrace -Sender Sunil.chauhan@xyz.com -Recipient testuser@xyz.com

Example 2 -: Track Message based on Recipient

POWERSHELL

POWERSHELL
Get-MessageTrace -Recipient testuser@xyz.com
POWERSHELL

Example 3 -: Track Message based on Sender and Recipient

POWERSHELL

POWERSHELL
Get-MessageTrace -Sender Sunil.chauhan@xyz.com
POWERSHELL

Example 4 -: By Default script will only search for last 24 hours logs, for tracking emails over 24 hours or more period use "-Days" Parameter.

Below example demonstrate searching for last 3 Day

POWERSHELL

# Get-MessageTrace -Sender Sunil.chauhan@xyz.com -Recipient testuser@xyz.com -days 3

Get-MessageTrace -Sender Sunil.chauhan@xyz.com -days 3

Get-MessageTrace -Recipient Sunil.chauhan@xyz.com -days 3

Download from GitHub

POWERSHELL
# Author : Sunil Chauhan
# Email: Sunilkms@gmail.com
POWERSHELL
# Example 1 -: Get-MessageTrace -Sender Sunil.chauhan@xyz.com -Recipient testuser@xyz.com
POWERSHELL
# Example 2 -: Get-MessageTrace -Sender Sunil.chauhan@xyz.com
POWERSHELL
# Example 3 -: Get-MessageTrace -Recipient testuser@xyz.com
POWERSHELL

POWERSHELL
# By Default only 24 hours of logs will be searched, for tracking last 3 Days
POWERSHELL
# Example 4 -: Get-MessageTrace -Sender Sunil@xyz.com -Recipient testuser@xyz.com -days 3
POWERSHELL
# Example 5 -: Get-MessageTrace -Sender Sunil.chauhan@xyz.com -days 3
POWERSHELL
# Example 6 -: Get-MessageTrace -Recipient Sunil.chauhan@xyz.com -days 3

function Get-MessageTrace {
 param(
 $sender,
 $Recipients,
 $days= 1
 )
POWERSHELL
write-host "By Default only 24 hours of logs will be searched, you can use parameter '-days 3' to search 3 days old logs" -ForegroundColor Yellow

$days= "-" + $days
$TS = Get-TransportServer
$report=@()

#Recipient Search Block
if ($Recipients -ne $null -and $sender -eq $null)
 {
 foreach ($Server in $ts)
 {
 $Logs=Get-MessageTrackingLog -Recipients $Recipients -Start (get-date).AddDays($days) -Server $Server.Name -ResultSize unlimited
 $Report+=$logs
 }
 if ($report)
 {
 $report | Select Sender,Recipients,MessageSubject,EventId,Timestamp,RecipientStatus | sort timestamp -Descending
 }
 }

#Sender Search Block
if ($sender -ne $null -and $Recipients -eq $null)
 {
 foreach ($Server in $ts)
 {
 $Logs=Get-MessageTrackingLog -Sender $sender -Start (get-date).AddDays($days) -Server $Server.Name -ResultSize unlimited
 $Report+=$logs
 }
 if ($report)
 {
 $report | Select Sender,Recipients,MessageSubject,EventId,Timestamp,RecipientStatus | sort timestamp -Descending
 }
 }

#Recipient & Sender Search Block
if ($Recipients -ne $null -and $sender -ne $null)
 {
 foreach ($Server in $ts)
 {
 $Logs=Get-MessageTrackingLog -Recipients $Recipients -Start (get-date).AddDays($days) -Server $Server.Name -ResultSize unlimited
 $Report+=$logs
 }
 if ($report)
 {
 $report | ? {$_.Sender -like $sender }| Select Sender,Recipients,MessageSubject,EventId,Timestamp,RecipientStatus | sort timestamp -Descending
 }
 }
}