diff --git a/Get Mailbox Auto Reply Configuration Report/GetMailboxAutoReplyConfiguration.ps1 b/Get Mailbox Auto Reply Configuration Report/GetMailboxAutoReplyConfiguration.ps1 new file mode 100644 index 0000000..82edb09 --- /dev/null +++ b/Get Mailbox Auto Reply Configuration Report/GetMailboxAutoReplyConfiguration.ps1 @@ -0,0 +1,257 @@ + + +param ( + [string] $UserName = $null, + [string] $Password = $null, + [Switch] $Enabled, + [Switch] $Scheduled, + [Switch] $DisabledMailboxes, + [Switch] $Today, + [String] $ActiveOOFAfterDays + +) + +#Checks ExchangeOnline module availability and connects the module +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 +} + +#This function checks the user choice and retrieves the OOF status +Function RetrieveOOFReport { + #Checks the users with scheduled OOF setup + if ($Scheduled.IsPresent) { + $global:ExportCSVFileName = "OOFScheduledUsersReport-" + ((Get-Date -format "MMM-dd hh-mm-ss tt").ToString()) + ".csv" + Get-mailbox -ResultSize Unlimited | foreach-object { + $CurrUser = $_ + $CurrOOFConfigData = Get-MailboxAutoReplyConfiguration -Identity ($CurrUser.PrimarySmtpAddress) | Where-object { $_.AutoReplyState -eq "Scheduled" } + if ($null -ne $CurrOOFConfigData ) { + PrepareOOFReport + ExportScheduledOOF + } + } + } + #Checks the OOF status on and after user mentioned days + elseif ($ActiveOOFAfterDays -gt 0) { + $global:ExportCSVFileName = "UpcomingOOFStatusReport-" + ((Get-Date -format "MMM-dd hh-mm-ss tt").ToString()) + ".csv" + $OOFStartDate = (Get-date).AddDays($ActiveOOFAfterDays).Date.ToString().split(" ") | Select -Index 0 + Get-mailbox -ResultSize Unlimited | foreach-object { + $CurrUser = $_ + $CurrOOFConfigData = Get-MailboxAutoReplyConfiguration -Identity ($CurrUser.PrimarySmtpAddress) | Where-object { $_.AutoReplyState -ne "Disabled" } + if ($null -ne $CurrOOFConfigData ) { + $CurrOOFStartDate = $CurrOOFConfigData.StartTime.ToString().split(" ") | select -Index 0 + $CurrOOFEndDate = $CurrOOFConfigData.EndTime.ToString().split(" ") | Select -Index 0 + $ActiveOOFAfterFlag = "true" + if($CurrOOFConfigData.AutoReplyState -eq "Enabled" -or ($OOFStartDate -ge $CurrOOFStartDate -and $OOFStartDate -le $CurrOOFEndDate)){ + PrepareOOFReport + ExportAllActiveOOFSetup + } + } + } + } + #Checks the OOF with enabled status + elseif ($Enabled.IsPresent) { + $global:ExportCSVFileName = "OOFEnabledUsersReport-" + ((Get-Date -format "MMM-dd hh-mm-ss tt").ToString()) + ".csv" + Get-mailbox -ResultSize Unlimited | foreach-object { + $CurrUser = $_ + $CurrOOFConfigData = Get-MailboxAutoReplyConfiguration -Identity ($CurrUser.PrimarySmtpAddress) | Where-object { $_.AutoReplyState -eq "Enabled" } + if ($null -ne $CurrOOFConfigData ) { + $EnabledFlag = 'true' + PrepareOOFReport + ExportEnabledOOF + } + } + } + #Checks whether OOF starting day is current day and process + elseif ($Today.Ispresent) { + $global:ExportCSVFileName = "OOFUsersTodayReport-" + ((Get-Date -format "MMM-dd hh-mm-ss tt").ToString()) + ".csv" + $CurrDate = (Get-Date).Date.ToString().split(" ") | Select -Index 0 + Get-mailbox -ResultSize Unlimited | foreach-object { + $CurrUser = $_ + $CurrOOFConfigData = Get-MailboxAutoReplyConfiguration -Identity ($CurrUser.PrimarySmtpAddress) | Where-object { $_.AutoReplyState -ne "Disabled" } + if ($null -ne $CurrOOFConfigData ) { + $CurrOOFStartDate = $CurrOOFConfigData.StartTime.ToString().split(" ") | select -Index 0 + $CurrOOFEndDate = $CurrOOFConfigData.EndTime.ToString().split(" ") | Select -Index 0 + if ($CurrDate -ge $CurrOOFStartDate -and $CurrDate -le $CurrOOFEndDate) { + PrepareOOFReport + ExportAllActiveOOFSetup + } + } + } + } + + #Checks the disabled mailoxes OOF configuration + elseif ($DisabledMailboxes.Ispresent) { + $global:ExportCSVFileName = "DisabledAccountsOOFConfigurationReport-" + ((Get-Date -format "MMM-dd hh-mm-ss tt").ToString()) + ".csv" + Get-mailbox -ResultSize Unlimited | Where-Object { $_.AccountDisabled -eq $TRUE } | foreach-object { + $CurrUser = $_ + $CurrOOFConfigData = Get-MailboxAutoReplyConfiguration -Identity ($CurrUser.PrimarySmtpAddress) | Where-object { $_.AutoReplyState -ne "Disabled" } + if ($null -ne $CurrOOFConfigData ) { + PrepareOOFReport + ExportDisabledMailboxOOFSetup + } + } + } + #Checks the all active OOF configuration + else { + $global:ExportCSVFileName = "OutofOfficeConfigurationReport-" + ((Get-Date -format "MMM-dd hh-mm-ss tt").ToString()) + ".csv" + Get-mailbox -ResultSize Unlimited | foreach-object { + $CurrUser = $_ + $CurrOOFConfigData = Get-MailboxAutoReplyConfiguration -Identity ($CurrUser.PrimarySmtpAddress) | Where-object { $_.AutoReplyState -ne "Disabled" } + if ($null -ne $CurrOOFConfigData ) { + PrepareOOFReport + ExportAllActiveOOFSetup + } + } + } +} + +#Checks the Boolean values +Function GetPrintableValue($RawData) { + if ($null -eq $RawData -or $RawData.Equals($false)) { + return "No" + } + else { + return "Yes" + } +} + +#Saves the users with OOF configuration +Function PrepareOOFReport { + $global:ReportSize = $global:ReportSize + 1 + + $EmailAddress = $CurrUser.PrimarySmtpAddress + $AccountStatus = $CurrUser.AccountDisabled + $MailboxOwner = $CurrOOFConfigData.MailboxOwnerId + $OOFStatus = $CurrOOFConfigData.AutoReplyState + $AutoCancelRequests = GetPrintableValue $CurrOOFConfigData.AutoDeclineFutureRequestsWhenOOF + $CancelAllEvents = GetPrintableValue $CurrOOFConfigData.DeclineAllEventsForScheduledOOF + $CancelScheduledEvents = GetPrintableValue $CurrOOFConfigData.DeclineEventsForScheduledOOF + $CreateOOFEvent = GetPrintableValue $CurrOOFConfigData.CreateOOFEvent + $ExternalAudience = $CurrOOFConfigData.ExternalAudience + $StartTime = $CurrOOFConfigData.StartTime + $EndTime = $CurrOOFConfigData.EndTime + $Duration = $EndTime - $StartTime + $TimeSpan = "$($Duration.Days.ToString('00'))d : $($Duration.Hours.ToString('00'))h : $($Duration.Minutes.ToString('00'))m"; + + if ($CurrOOFConfigData.InternalMessage -ne "") { + $InternalMessage = (($CurrOOFConfigData.InternalMessage) -replace '<.*?>', '').Trim() + } + else { $InternalMessage = "-" } + if ($CurrOOFConfigData.ExternalMessage -ne "") { + $ExternalMessage = (($CurrOOFConfigData.ExternalMessage) -replace '<[^>]+>', '').Trim() + } + else { $ExternalMessage = "-" } + + if ($EnabledFlag -eq 'true') { + $global:OOFDuration = 'OOF Duration' + } + else { + $global:OOFDuration = 'OOF Duration (Days:Hours:Mins)' + } + if ($OOFStatus -eq 'Enabled') { + $StartTime = "-" + $EndTime = "-" + $TimeSpan = 'Until auto-reply is disabled' + } + + Write-Progress "Retrieving the OOF Status of the User: $MailboxOwner" "Processed Users Count: $global:ReportSize" + + #Save values with output column names + $ExportResult = @{ + + 'Email Address' = $EmailAddress; + 'Disabled Account' = $AccountStatus; + 'Mailbox Owner' = $MailboxOwner; + 'Auto Reply State' = $OOFStatus; + 'Start Time' = $StartTime; + 'End Time' = $EndTime; + 'Decline Future Requests' = $AutoCancelRequests; + 'Decline All Events' = $CancelAllEvents; + 'Decline Scheduled Events' = $CancelScheduledEvents; + 'Create OOF Event' = $CreateOOFEvent; + 'External Audience' = $ExternalAudience; + 'Internal Message' = $InternalMessage; + 'External Message' = $ExternalMessage; + $global:OOFDuration = $TimeSpan + } + + $global:ExportResults = New-Object PSObject -Property $ExportResult +} + +#Exports the users with OOF schedued configuration +Function ExportScheduledOOF { + $global:ExportResults | Select-object 'Mailbox Owner', 'Email Address', 'Start Time', 'End Time', $global:OOFDuration, 'Decline Future Requests', 'Decline All Events', 'Decline Scheduled Events', 'Create OOF Event', 'External Audience', 'Internal Message', 'External Message', 'Disabled Account' | Export-csv -path $global:ExportCSVFileName -NoType -Append -Force +} + +#Exports the users with OOF Enabled configuration +Function ExportEnabledOOF { + $global:ExportResults | Select-object 'Mailbox Owner', 'Email Address', $global:OOFDuration, 'External Audience', 'Internal Message', 'External Message', 'Disabled Account' | Export-csv -path $global:ExportCSVFileName -NoType -Append -Force +} + +#Exports all the users with OOF configuration +Function ExportAllActiveOOFSetup { + if($ActiveOOFAfterFlag = "true"){ + $global:ExportResults | Select-object 'Mailbox Owner', 'Email Address', 'Auto Reply State', 'Start Time', 'End Time', $global:OOFDuration, 'External Audience', 'Internal Message', 'External Message','Disabled Account' | Export-csv -path $global:ExportCSVFileName -NoType -Append -Force + } + else{ + $global:ExportResults | Select-object 'Mailbox Owner', 'Email Address', 'Auto Reply State', 'Start Time', 'End Time', $global:OOFDuration, 'External Audience', 'Internal Message', 'External Message', 'Decline Future Requests', 'Decline All Events', 'Decline Scheduled Events', 'Create OOF Event', 'Disabled Account' | Export-csv -path $global:ExportCSVFileName -NoType -Append -Force + } +} + +Function ExportDisabledMailboxOOFSetup { + $global:ExportResults | Select-object 'Mailbox Owner', 'Email Address', 'Auto Reply State', 'Start Time', 'End Time', $global:OOFDuration, 'Decline Future Requests', 'Decline All Events', 'Decline Scheduled Events', 'Create OOF Event', 'External Audience', 'Internal Message', 'External Message' | Export-csv -path $global:ExportCSVFileName -NoType -Append -Force +} + +#Execution starts here +ConnectToExchange +$global:ReportSize = 0 +RetrieveOOFReport + +#Validates the output file +if ((Test-Path -Path $global:ExportCSVFileName) -eq "True") { + #Open file after code execution finishes + Write-Host "The output file available in $global:ExportCSVFileName" -ForegroundColor Green + write-host "Exported $global:ReportSize records to CSV." + Write-Host "For more Office 365 related PowerShell scripts, check https://o365reports.com" -ForegroundColor Cyan + $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" + +<# +============================================================================================= +For detailed Script execution: https://o365reports.com/2021/08/18/get-mailbox-automatic-reply-configuration-using-powershell +============================================================================================ +#> \ No newline at end of file