diff --git a/office_365/Manage_Mailboxes b/office_365/Manage_Mailboxes new file mode 100644 index 0000000..745e2f1 --- /dev/null +++ b/office_365/Manage_Mailboxes @@ -0,0 +1,286 @@ +# ================================ +# Exchange Online Mailbox Manager (MSP Edition) +# ================================ + +# Global Variables +$global:Connected = $false +$LogFile = "$PSScriptRoot\MailboxTool.log" + +# ================================ +# Logging +# ================================ +function Write-Log { + param ($Message) + $time = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + $entry = "$time - $Message" + Write-Host $entry + Add-Content -Path $LogFile -Value $entry +} + +# ================================ +# Connection +# ================================ +function Connect-EXO { + try { + Write-Host "Connecting to Exchange Online..." -ForegroundColor Cyan + Connect-ExchangeOnline -ShowBanner:$false + $global:Connected = $true + Write-Log "Connected to Exchange Online" + } catch { + Write-Log "Connection failed: $_" + } +} + +function Disconnect-EXO { + Disconnect-ExchangeOnline -Confirm:$false + $global:Connected = $false + Write-Log "Disconnected from Exchange Online" +} + +function Ensure-Connection { + if (-not $global:Connected) { + Write-Host "Not connected. Connecting now..." -ForegroundColor Yellow + Connect-EXO + } +} + +# ================================ +# Helper: Convert Size to GB +# ================================ +function Convert-ToGB { + param ($sizeString) + + if ($sizeString -match "([\d\.]+)\sGB") { + return [math]::Round([double]$matches[1],2) + } elseif ($sizeString -match "([\d\.]+)\sMB") { + return [math]::Round(([double]$matches[1] / 1024),2) + } else { + return 0 + } +} + +# ================================ +# Mailbox Listing +# ================================ +function Get-AllMailboxes { + Ensure-Connection + Get-Mailbox -ResultSize Unlimited | Select DisplayName, PrimarySmtpAddress +} + +# ================================ +# Archive Management +# ================================ +function Get-ArchiveEnabled { + Ensure-Connection + Get-Mailbox -ResultSize Unlimited | + Where-Object {$_.ArchiveStatus -eq "Active"} | + Select DisplayName, PrimarySmtpAddress, ArchiveStatus +} + +function Get-ArchiveDisabled { + Ensure-Connection + Get-Mailbox -ResultSize Unlimited | + Where-Object {$_.ArchiveStatus -ne "Active"} | + Select DisplayName, PrimarySmtpAddress, ArchiveStatus +} + +function Check-ArchiveSingle { + Ensure-Connection + $user = Read-Host "Enter email" + $mb = Get-Mailbox -Identity $user + Write-Host "`nArchive Status: $($mb.ArchiveStatus)" -ForegroundColor Green +} + +function Enable-ArchiveSingle { + Ensure-Connection + $user = Read-Host "Enter email" + Enable-Mailbox -Identity $user -Archive + Write-Log "Archive enabled for $user" +} + +function Disable-ArchiveSingle { + Ensure-Connection + $user = Read-Host "Enter email" + Disable-Mailbox -Identity $user -Archive + Write-Log "Archive disabled for $user" +} + +# ================================ +# Bulk Operations +# ================================ +function Bulk-Enable-Archive { + Ensure-Connection + $file = Read-Host "Enter CSV path (column: UserPrincipalName)" + $users = Import-Csv $file + + foreach ($u in $users) { + try { + Enable-Mailbox -Identity $u.UserPrincipalName -Archive + Write-Log "Enabled archive: $($u.UserPrincipalName)" + } catch { + Write-Log "Failed: $($u.UserPrincipalName) - $_" + } + } +} + +# ================================ +# Mailbox + Archive Size Report +# ================================ +function Get-MailboxFullSizeReport { + Ensure-Connection + + Write-Host "Fetching mailbox + archive sizes..." -ForegroundColor Cyan + + $results = @() + $mailboxes = Get-Mailbox -ResultSize Unlimited + + foreach ($mb in $mailboxes) { + try { + $primaryStats = Get-MailboxStatistics -Identity $mb.PrimarySmtpAddress + + $primarySizeGB = Convert-ToGB $primaryStats.TotalItemSize.ToString() + + $archiveSizeGB = 0 + $archiveStatus = $mb.ArchiveStatus + + try { + $archiveStats = Get-MailboxStatistics -Identity $mb.PrimarySmtpAddress -Archive -ErrorAction Stop + $archiveSizeGB = Convert-ToGB $archiveStats.TotalItemSize.ToString() + } catch { + $archiveSizeGB = 0 + } + + # Detect Issues + $status = "OK" + if ($primarySizeGB -gt 80 -and $archiveStatus -ne "Active") { + $status = "⚠ No Archive + Large Mailbox" + } elseif ($archiveStatus -eq "Active" -and $archiveSizeGB -lt 1) { + $status = "⚠ Archive Enabled but Not Used" + } + + $results += [PSCustomObject]@{ + DisplayName = $mb.DisplayName + Email = $mb.PrimarySmtpAddress + PrimaryGB = $primarySizeGB + ArchiveGB = $archiveSizeGB + ArchiveStatus = $archiveStatus + HealthStatus = $status + } + + } catch { + Write-Log "Failed: $($mb.PrimarySmtpAddress) - $_" + } + } + + return $results +} + +# ================================ +# Export Report +# ================================ +function Export-MailboxFullReport { + $path = "$PSScriptRoot\MailboxFullReport.csv" + Get-MailboxFullSizeReport | Export-Csv $path -NoTypeInformation + Write-Host "Report exported to $path" -ForegroundColor Green +} + +# ================================ +# Menu System +# ================================ +function Show-MainMenu { + Clear-Host + Write-Host "========================================" -ForegroundColor Cyan + Write-Host " Exchange Online Mailbox Tool (MSP)" + Write-Host "========================================" + Write-Host "1. Connect" + Write-Host "2. List Mailboxes" + Write-Host "3. Archive Management" + Write-Host "4. Reports" + Write-Host "5. Bulk Operations" + Write-Host "6. Disconnect" + Write-Host "0. Exit" +} + +function Show-ArchiveMenu { + Write-Host "`n--- Archive Management ---" + Write-Host "1. List Enabled" + Write-Host "2. List Disabled" + Write-Host "3. Check User" + Write-Host "4. Enable Archive" + Write-Host "5. Disable Archive" + Write-Host "0. Back" +} + +function Show-ReportMenu { + Write-Host "`n--- Reports ---" + Write-Host "1. Mailbox + Archive Size Report" + Write-Host "2. Export Full Report" + Write-Host "0. Back" +} + +function Show-BulkMenu { + Write-Host "`n--- Bulk ---" + Write-Host "1. Bulk Enable Archive" + Write-Host "0. Back" +} + +# ================================ +# Main Loop +# ================================ +do { + Show-MainMenu + $choice = Read-Host "Select option" + + switch ($choice) { + + 1 { Connect-EXO } + + 2 { Get-AllMailboxes | Format-Table } + + 3 { + do { + Show-ArchiveMenu + $a = Read-Host "Select option" + + switch ($a) { + 1 { Get-ArchiveEnabled | Format-Table } + 2 { Get-ArchiveDisabled | Format-Table } + 3 { Check-ArchiveSingle } + 4 { Enable-ArchiveSingle } + 5 { Disable-ArchiveSingle } + } + } while ($a -ne 0) + } + + 4 { + do { + Show-ReportMenu + $r = Read-Host "Select option" + + switch ($r) { + 1 { Get-MailboxFullSizeReport | Format-Table -AutoSize } + 2 { Export-MailboxFullReport } + } + } while ($r -ne 0) + } + + 5 { + do { + Show-BulkMenu + $b = Read-Host "Select option" + + switch ($b) { + 1 { Bulk-Enable-Archive } + } + } while ($b -ne 0) + } + + 6 { Disconnect-EXO } + + } + + Pause + +} while ($choice -ne 0) + +Write-Host "Exiting..." -ForegroundColor Yellow \ No newline at end of file