From c8f65c57e6adec4b1804e7537f3642b6b44a08f1 Mon Sep 17 00:00:00 2001 From: AdminDroid <49208841+admindroid-community@users.noreply.github.com> Date: Wed, 9 Jun 2021 20:04:47 +0530 Subject: [PATCH] Office 365 External Email Forwarding Report Office 365 External Email Forwarding Report --- .../EmailForwardingReport.ps1 | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 Office 365 Email Forwarding Report/EmailForwardingReport.ps1 diff --git a/Office 365 Email Forwarding Report/EmailForwardingReport.ps1 b/Office 365 Email Forwarding Report/EmailForwardingReport.ps1 new file mode 100644 index 0000000..cefc2df --- /dev/null +++ b/Office 365 Email Forwarding Report/EmailForwardingReport.ps1 @@ -0,0 +1,161 @@ + +param( + [string] $UserName = $null, + [string] $Password = $null, + [Switch] $InboxRules, + [Switch] $MailFlowRules +) + + +Function GetPrintableValue($RawData) { + if (($null -eq $RawData) -or ($RawData.Equals(""))) { + return "-"; + } + else { + $StringVal = $RawData | Out-String + return $StringVal; + } +} + +Function GetAllMailForwardingRules { + Write-host "Preparing the Email Forwarding Report..." + if($InboxRules.IsPresent) { + $global:ExportCSVFileName = "InboxRulesWithEmailForwarding_" + ((Get-Date -format "MMM-dd hh-mm-ss tt").ToString()) + ".csv" + Get-Mailbox -ResultSize Unlimited | ForEach-Object { + Write-Progress "Processing the Inbox Rule for the User: $($_.Id)" " " + Get-InboxRule -Mailbox $_.PrimarySmtpAddress | Where-Object { $_.ForwardAsAttachmentTo -ne $Empty -or $_.ForwardTo -ne $Empty -or $_.RedirectTo -ne $Empty} | ForEach-Object { + $CurrUserRule = $_ + GetInboxRulesInfo + } + } + } + Elseif ($MailFlowRules.IsPresent) { + $global:ExportCSVFileName = "TransportRulesWithEmailForwarding_" + ((Get-Date -format "MMM-dd hh-mm-ss tt").ToString()) + ".csv" + Get-TransportRule -ResultSize Unlimited | Where-Object { $_.RedirectMessageTo -ne $Empty } | ForEach-Object { + Write-Progress -Activity "Processing the Transport Rule: $($_.Name)" " " + $CurrEmailFlowRule = $_ + GetMailFlowRulesInfo + } + } + else{ + $global:ExportCSVFileName = "EmailForwardingReport_" + ((Get-Date -format "MMM-dd hh-mm-ss tt").ToString()) + ".csv" + Get-Mailbox -ResultSize Unlimited | Where-Object { $_.ForwardingSMTPAddress -ne $Empty -or $_.ForwardingAddress -ne $Empty} | ForEach-Object { + Write-Progress -Activity "Processing Mailbox Forwarding Rules for the User: $($_.Id)" " " + $CurrEmailSetUp = $_ + GetMailboxForwardingInfo + } + } +} + + +Function GetMailboxForwardingInfo { + $global:ReportSize = $global:ReportSize + 1 + $MailboxOwner = $CurrEmailSetUp.PrimarySMTPAddress + $DeliverToMailbox = $CurrEmailSetUp.DeliverToMailboxandForward + if ($null -ne $CurrEmailSetUp.ForwardingSMTPAddress) { + $CurrEmailSetUp.ForwardingSMTPAddress = GetPrintableValue (($CurrEmailSetUp.ForwardingSMTPAddress).split(":") | Select -Index 1) + } + $ForwardingSMTPAddress = GetPrintableValue $CurrEmailSetUp.ForwardingSMTPAddress + if ($null -ne $CurrEmailSetUp.ForwardingAddress){ + $CurrEmailSetUp.ForwardingAddress = GetPrintableValue ($CurrEmailSetUp.ForwardingAddress) + } + $ForwardTo = GetPrintableValue $CurrEmailSetUp.ForwardingAddress + + #ExportResults + $ExportResult = @{'Mailbox Name' = $MailboxOwner; 'Forwarding SMTP Address' = $ForwardingSMTPAddress;'Forward To' =$ForwardTo; 'Deliver To Mailbox and Forward' = $DeliverToMailbox} + $ExportResults = New-Object PSObject -Property $ExportResult + $ExportResults | Select-object 'Mailbox Name', 'Forwarding SMTP Address','Forward To','Deliver To Mailbox and Forward' | Export-csv -path $global:ExportCSVFileName -NoType -Append -Force +} + +Function GetInboxRulesInfo { + $global:ReportSize = $global:ReportSize + 1 + $MailboxOwner = $CurrUserRule.MailboxOwnerId + $RuleName = $CurrUserRule.Name + $Enable = $CurrUserRule.Enabled + $StopProcessingRules = $CurrUserRule.StopProcessingRules + if ($null -ne $CurrUserRule.RedirectTo) { + $CurrUserRule.RedirectTo = GetPrintableValue (($CurrUserRule.RedirectTo).split("[") | Select-Object -Index 0).Replace('"', '').Trim() + } + $RedirectTo = GetPrintableValue $CurrUserRule.RedirectTo + if ($null -ne $CurrUserRule.ForwardAsAttachmentTo) { + $CurrUserRule.ForwardAsAttachmentTo = GetPrintableValue (($CurrUserRule.ForwardAsAttachmentTo).split("[") | Select-Object -Index 0).Replace('"', '').Trim() + } + $ForwardAsAttachment = GetPrintableValue $CurrUserRule.ForwardAsAttachmentTo + if ($null -ne $CurrUserRule.ForwardTo) { + $CurrUserRule.ForwardTo = GetPrintableValue (($CurrUserRule.ForwardTo).split("[") | Select-Object -Index 0).Replace('"', '').Trim() + } + $ForwardTo = GetPrintableValue $CurrUserRule.ForwardTo + + #ExportResults + $ExportResult = @{'Mailbox Name' = $MailboxOwner; 'Inbox Rule' = $RuleName; 'Rule Status' = $Enable; 'Forward As Attachment To' = $ForwardAsAttachment; 'Forward To' = $ForwardTo; 'Stop Processing Rules' = $StopProcessingRules; 'Redirect To' = $RedirectTo } + $ExportResults = New-Object PSObject -Property $ExportResult + $ExportResults | Select-object 'Mailbox Name', 'Inbox Rule', 'Forward To', 'Redirect To', 'Forward As Attachment To','Stop Processing Rules', 'Rule Status' | Export-csv -path $global:ExportCSVFileName -NoType -Append -Force +} + +Function GetMailFlowRulesInfo { + $global:ReportSize = $global:ReportSize + 1 + $RuleName = $CurrEmailFlowRule.Name + $State = $CurrEmailFlowRule.State + $Mode = $CurrEmailFlowRule.Mode + $Priority = $CurrEmailFlowRule.Priority + $StopProcessingRules = $CurrEmailFlowRule.StopRuleProcessing + if ($null -ne $CurrEmailFlowRule.RedirectMessageTo) { + $CurrEmailFlowRule.RedirectMessageTo = GetPrintableValue ($CurrEmailFlowRule.RedirectMessageTo).Replace('{}', '').Trim() + } + $RedirectTo = $CurrEmailFlowRule.RedirectMessageTo + + #ExportResults + $ExportResult = @{'Mail Flow Rule Name' = $RuleName; 'State' = $State; 'Mode' = $Mode; 'Priority' = $Priority; 'Redirect To' = $RedirectTo; 'Stop Processing Rule' = $StopProcessingRules} + $ExportResults = New-Object PSObject -Property $ExportResult + $ExportResults | Select-object 'Mail Flow Rule Name','Redirect To', 'Stop Processing Rule','State', 'Mode', 'Priority' | Export-csv -path $global:ExportCSVFileName -NoType -Append -Force +} + +Function ConnectToExchange { + $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" + Install-Module ExchangeOnlineManagement -Repository PSGallery -AllowClobber -Force + Write-host "ExchangeOnline PowerShell module is installed in the machine successfully." + } + elseif ($confirm -cnotmatch "[yY]" ) { + Write-host "Exiting. `nNote: ExchangeOnline PowerShell module must be available in your system to run the script." + Exit + } + } + #Storing credential in script for scheduling purpose/Passing credential as parameter + 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 -ShowProgress $false | Out-Null + } + else { + Connect-ExchangeOnline | Out-Null + } + Write-Host "ExchangeOnline PowerShell module is connected successfully" + #End of Connecting Exchange Online +} + +ConnectToExchange +$global:ReportSize = 0 +GetAllMailForwardingRules +Write-Progress -Activity "--" -Completed + +Write-Host "`nFor more Office 365 PowerShell scripts, please visit O365reports.com" -ForegroundColor cyan +if ((Test-Path -Path $global:ExportCSVFileName) -eq "True") { + Write-Host "The output file available in $global:ExportCSVFileName" -ForegroundColor Green + Write-Host "The exported report has $global:ReportSize email forwarding configurations" + $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 "$global:ExportCSVFileName" + } +} +else { + Write-Host "No data found with the specified criteria" +} +Disconnect-ExchangeOnline -Confirm:$false -InformationAction Ignore -ErrorAction SilentlyContinue +Write-Host "Disconnected active ExchangeOnline session" +