Advanced Windows PowerShell Scripting Video Training

Advanced Windows PowerShell Scripting Video Training
Advanced Windows PowerShell Scripting Video Training

Wednesday, September 19, 2012

Extract mailboxes that are forwarding email outside of your domain with PowerShell

 

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

 

2 comments:

Ballekes said...

Hi,

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.

Jason Yoder, MCT said...

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.