mirror of
https://github.com/admindroid-community/powershell-scripts.git
synced 2025-12-17 16:35:19 +00:00
257 lines
12 KiB
PowerShell
257 lines
12 KiB
PowerShell
|
|
|
||
|
|
|
||
|
|
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
|
||
|
|
============================================================================================
|
||
|
|
#>
|