Find Inbox Rules with External Forwarding

Find Inbox Rules that Forwards Email Externally
This commit is contained in:
AdminDroid 2023-06-28 14:48:41 +05:30
parent 7b47d4f64f
commit b09b952fd2

View File

@ -0,0 +1,212 @@
<#
=============================================================================================
Name: Find inbox rules with external email forwarding
Description: This script Finds all inbox rules that forwards emails externally in Office 365 using PowerShell
Website: o365reports.com
For detailed script execution: https://o365reports.com/2022/06/09/find-office365-inbox-rules-with-external-forwarding-powershell
============================================================================================
#>
#PARAMETERS
param (
[string] $UserName = $null,
[String] $Password = $null,
[Switch] $ExcludeGuestUsers
)
#Check for ExchangeOnline module availability
$Exchange = (Get-Module ExchangeOnlineManagement -ListAvailable).Name
if ($Exchange -eq $null)
{
Write-Host "Important: ExchangeOnline PowerShell module is unavailable. It is mandatory to have this module installed in the system to run the script successfully."
$Confirm = Read-Host Are you sure you want to install module? [Y] Yes [N] No
if ($Confirm -match "[yY]")
{
Write-Host "Installing ExchangeOnlineManagement..." -ForegroundColor Magenta
Install-Module ExchangeOnlineManagement -Repository PSGallery -AllowClobber -Force
Import-Module ExchangeOnlineManagement -Force
Write-Host "ExchangeOnline PowerShell module is installed in the machine successfully." -ForegroundColor Green
}
else
{
Write-Host "Exiting. `nNote: ExchangeOnline PowerShell module must be available in your system to run the script."
Exit
}
}
#Connecting to ExchangeOnline .......
Write-Host "Connecting to ExchangeOnline..." -ForegroundColor Cyan
if(($UserName -ne "") -and ($Password -ne ""))
{
$SecuredPassword = ConvertTo-SecureString -AsPlainText $Password -Force
$Credential = New-Object System.Management.Automation.PSCredential $UserName,$SecuredPassword
Connect-ExchangeOnline -Credential $Credential
}
else
{
Connect-ExchangeOnline
}
Write-Host "ExchangeOnline module successfully connected..." -ForegroundColor Green
#Function for export output to CSV file
Function ExportCSV
{
$ForwardTo = if($ForwardTo.External.count -eq 0 -and $ForwardTo.Guest.count -eq 0){"-"}else{($ForwardTo.External + $ForwardTo.Guest)-join ', '}
$ForwardAsAttachmentTo = if($ForwardAsAttachmentTo.External.count -eq 0 -and $ForwardAsAttachmentTo.Guest.count -eq 0){"-"}else{($ForwardAsAttachmentTo.External + $ForwardAsAttachmentTo.Guest) -join ', '}
$RedirectTo = if($RedirectTo.External.count -eq 0 -and $RedirectTo.Guest.count -eq 0){"-"}else{($RedirectTo.External + $RedirectTo.Guest) -join ', '}
if($ForwardTo -ne "-" -or $ForwardAsAttachmentTo -ne "-" -or $RedirectTo -ne "-")
{
$Global:InboxRuleWithExternalEmailCount++
$Result = @{'Mailbox Name'= $MailBoxName;'UPN'= $UPN;'Inbox Rule Name'= $_.Name;'Forward To'= $ForwardTo; 'Forward As Attachment To'= $ForwardAsAttachmentTo; 'Redirect To'= $RedirectTo}
$ExportResult = New-Object PSObject -Property $Result
$ExportResult | Select-Object 'Mailbox Name','UPN','Inbox Rule Name','Forward To','Forward As Attachment To','Redirect To' | Export-CSV $OutputCsv -NoTypeInformation -Append
}
}
#Getting InboxRules with external email configuration......
Write-Host "Getting InboxRules with external email configuration..."
$OutputCsv=".\InboxRuleWithExternalEmails_$((Get-Date -format MMM-dd` hh-mm` tt).ToString()).csv"
$InboxRuleCount = 0
$Global:InboxRuleWithExternalEmailCount = 0
$GuestUser = Get-MailUser -ResultSize unlimited
Get-Mailbox -ResultSize unlimited | foreach {
$MailBoxName = $_.DisplayName
$UPN = $_.UserPrincipalName
Write-Progress -Activity "Updating... $Global:InboxRuleWithExternalEmailCount InboxRule found with external email " -Status "Getting InboxRule from '' $MailBoxName'' mailbox"
Get-InboxRule -MailBox $_.PrimarySmtpAddress | foreach {
$InboxRuleCount++
$ForwardTo = @{External=@();Guest=@()}
$ForwardAsAttachmentTo = @{External=@();Guest=@()}
$RedirectTo = @{External=@();Guest=@()}
#ForwardTo
if ($_.ForwardTo -ne $null )
{
$UserinForwardTo = ( $_.ForwardTo -split ',' )
$ExternalUser= $UserinForwardTo | Where-Object {$_ -match "SMTP:"}
$InternalAndGuestUser = $UserinForwardTo | Where-Object {$_ -notmatch "SMTP:"}
#Get external users email in ForwardTo
foreach($ExternalUsers in $ExternalUser)
{
$ForwardTo.External += (($ExternalUsers -split " ")[0].TrimStart('"')).TrimEnd('"')
}
#Get guest users email in ForwardTo
if(!$ExcludeGuestUsers.IsPresent)
{
foreach($InternalAndGuestUsers in $InternalAndGuestUser)
{
$InternalAndGuestUsers= (($InternalAndGuestUsers -split ":")[1])
$GuestUser | foreach {
if($InternalAndGuestUsers -eq $_.LegacyExchangeDN+"]")
{
$ForwardTo.Guest += $_.OtherMail
}
}
}
}
}
#ForwardAsAttachmentTo
if ($_.ForwardAsAttachmentTo -ne $null )
{
$UserinForwardAsAttachmentTo = ( $_.ForwardAsAttachmentTo -split ',' )
$ExternalUser = $UserinForwardAsAttachmentTo | Where-Object {$_ -match "SMTP:"}
$InternalAndGuestUser = $UserinForwardAsAttachmentTo | Where-Object {$_ -notmatch "SMTP:"}
#Get external users email in ForwardAsAttachmentTo
foreach($ExternalUsers in $ExternalUser)
{
$ForwardAsAttachmentTo.External += (($ExternalUsers -split " ")[0].TrimStart('"')).TrimEnd('"')
}
#Get guest users email in ForwardAsAttachmentTo
if(!$ExcludeGuestUsers.IsPresent)
{
foreach($InternalAndGuestUsers in $InternalAndGuestUser)
{
$InternalAndGuestUsers= (($InternalAndGuestUsers -split ":")[1])
$GuestUser | foreach {
if($InternalAndGuestUsers -eq $_.LegacyExchangeDN+"]")
{
$ForwardAsAttachmentTo.Guest += $_.OtherMail
}
}
}
}
}
#RedirectTo
if ($_.RedirectTo -ne $null )
{
$UserinRedirectTo = ( $_.RedirectTo -split ',' )
$ExternalUser = $UserinRedirectTo | Where-Object {$_ -match "SMTP:"}
$InternalAndGuestUser = $UserinRedirectTo | Where-Object {$_ -notmatch "SMTP:"}
#Get external users email in RedirectTo
foreach($ExternalUsers in $ExternalUser)
{
$RedirectTo.External += (($ExternalUsers -split " ")[0].TrimStart('"')).TrimEnd('"')
}
#Get guest users email in RedirectTo
if(!$ExcludeGuestUsers.IsPresent)
{
foreach($InternalAndGuestUsers in $InternalAndGuestUser)
{
$InternalAndGuestUsers= (($InternalAndGuestUsers -split ":")[1])
$GuestUser | foreach {
if($InternalAndGuestUsers -eq $_.LegacyExchangeDN+"]")
{
$RedirectTo.Guest += $_.OtherMail
}
}
}
}
}
#Export output to CSV file
ExportCSV
}
}
Write-Host "Script executed successfully."
#Open output file after execution
if($InboxRuleCount -eq 0)
{
Write-Host "No InboxRule found in this organization."
}
else
{
Write-Host "$InboxRuleCount InboxRule found in this organization."
if($Global:InboxRuleWithExternalEmailCount -eq 0)
{
Write-Host "But no InboxRule found with external email."
}
else
{
Write-Host "$Global:InboxRuleWithExternalEmailCount InboxRule found with external email."
if((Test-Path -Path $OutputCsv) -eq "True")
{
Write-Host "The InboxRule with external email configuration report available in : $OutputCsv " -ForegroundColor Green
$Prompt = New-Object -ComObject wscript.shell
$UserInput = $Prompt.popup("Do you want to open output file?",` 0,"Open Output File",4)
If ($UserInput -eq 6)
{
Invoke-Item "$OutputCSV"
}
}
}
}
#Clean up session
Get-PSSession | Remove-PSSession