Get Mailbox auto reply configuration report

Get users Out-of-Office configuration report
This commit is contained in:
AdminDroid 2021-08-18 18:29:39 +05:30
parent 623d71377b
commit bd39449075

View File

@ -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
============================================================================================
#>