While instructing a PowerShell class at the Federal Reserve Bank in Philadelphia, I took an opportunity to take a real PowerShell need and incorporate it into class. The need was to discover any user accounts that had rules in Outlook that forward emails outside of the organization. Below is the resulting script.
# This code is intended to run on the Exchange server in the
# Exchange Management Shell. It is also intended to be a
# module or Dot sourced into the session.
# Enable the line of code below to Import the Exchange cmdlets.
# Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
<#
.SYNOPSIS
Retrieves mailboxes that have forwarding rules outside of your email system.
.DESCRIPTION
Retrieves mailboxes that have forwarding rules outside of your email system and presents you with the mailbox owner and the forwarded address .PARAMETER EmailDomain The name of your email domain. Any forward rules that do not match this domain will be reported.
.EXAMPLE
Find-ForwardedEmails FRB.org
Mailbox External Address
------- ----------------
Adatum.com/Marketing/Paul West
{"myaccount@somewhere.com" [SMTP:myaccount@somewhere.com]} Adatum.com/Marketing/Paul West {"Pual@yahoo.com" [SMTP:Pual@yahoo.com]} Adatum.com/Executives/Scott MacDonald {"Scott@hotmail.com" [SMTP:Scott@hotmail.com]} Adatum.com/Users/Jason A. Yoder {"Jason@Gmail.com" [SMTP:Jason@Gmail.com]}
.NOTES
This function is provided without support or warranty.
Always examine any PowerShell code that you download and understand it before using it.
#>
Function Find-ForwardedEmails
{
Param (
[CmdletBinding()]
[Parameter(Mandatory=$True)][string]$EmailDomain
)
Try
{
Write-Host "Collecting Mailbox Data, please wait" -ForegroundColor Green
$MailboxList = Get-Mailbox -ea Stop
}
Catch
{
Write-Host "Error in Mailbox" -ForegroundColor red -BackgroundColor black
}
Finally
{
Write-Host "Completed collecting mailbox data." -ForegroundColor Green
Write-host "Total mailboxes processed: "($MailboxList).count
}
# Collect Rule information from the mailboxes
Try
{
Write-Host "Collecting Rulw Data, please wait" -ForegroundColor Green
$RuleList = $MailBoxList |
Get-InboxRule -ea SilentlyContinue |
Where-Object {$_.ForwardTo -notLike "*$EmailDomain*"}
}
Catch
{
Write-Host "Error in Rules" -ForegroundColor red -BackgroundColor black
}
Finally
{
Write-Host "Completed collecting rules data." -ForegroundColor Green
Write-host "Total rules processed: "($RuleList).count
}
# Output the data to the pipeline.
ForEach ($Rule in $RuleList)
{
$Obj = New-Object PSObject
$Obj | Add-Member -MemberType NoteProperty -Name "Mailbox"
-Value $Rule.MailBoxOwnerID
$Obj | Add-Member -MemberType NoteProperty -Name "External Address" -Value $Rule.ForwardTo
# Send the data to the pipeline.
Write-Output $Obj
}
} # End Function: Find ForwardedEmails
Comments
Nice, thanks!
We have a mixed environment, Exchange and Lotus Domino... does anyone know if this would be possible on Domino?
You can use "tell amgr schedule" in the Domino console to retrieve enabled agents running on mailboxes but what about mail rules that forward messages to external addresses?
Grts.
I'm glad that you liked the post. The client that I was working with at the time was migrating from Domino to Exchange 2010. I have not had the opportunity to look for a PowerShell module for Domino. The above code is part of the Exchange 2010 module.