# ========================================== # Microsoft 365 Compliance Search Tool (MSP) # ========================================== # Global $global:Connected = $false $LogFile = "$PSScriptRoot\ComplianceTool.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 } # ================================ # Connect Compliance # ================================ function Connect-Compliance { try { Write-Host "Connecting to Compliance Center..." -ForegroundColor Cyan Connect-IPPSSession $global:Connected = $true Write-Log "Connected to Compliance Center" } catch { Write-Log "Connection failed: $_" } } function Disconnect-Compliance { Get-PSSession | Remove-PSSession $global:Connected = $false Write-Log "Disconnected" } function Ensure-Connection { if (-not $global:Connected) { Write-Host "Not connected. Connecting..." -ForegroundColor Yellow Connect-Compliance } } # ================================ # Search Functions # ================================ function New-ComplianceSearchMenu { Ensure-Connection $name = Read-Host "Enter Search Name" $mailboxes = Read-Host "Enter mailboxes (comma separated or ALL)" $query = Read-Host "Enter search query (leave blank for all)" if ($mailboxes -eq "ALL") { $mailboxes = "All" } try { New-ComplianceSearch -Name $name ` -ExchangeLocation $mailboxes ` -ContentMatchQuery $query Write-Log "Search created: $name" } catch { Write-Log "Error creating search: $_" } } function Start-ComplianceSearchMenu { Ensure-Connection $name = Read-Host "Enter Search Name" try { Start-ComplianceSearch -Identity $name Write-Log "Search started: $name" } catch { Write-Log "Error: $_" } } function Get-ComplianceSearchList { Ensure-Connection Get-ComplianceSearch | Select Name, Status, Items, Size | Format-Table } function Get-ComplianceSearchStatus { Ensure-Connection $name = Read-Host "Enter Search Name" Get-ComplianceSearch -Identity $name | Format-List } function Remove-ComplianceSearchMenu { Ensure-Connection $name = Read-Host "Enter Search Name" try { Remove-ComplianceSearch -Identity $name -Confirm:$false Write-Log "Deleted search: $name" } catch { Write-Log "Error deleting search: $_" } } # ================================ # Export (PST Preparation) # ================================ function Export-ComplianceSearchMenu { Ensure-Connection $name = Read-Host "Enter Search Name" try { New-ComplianceSearchAction -SearchName $name -Export Write-Log "Export job created for: $name" Write-Host "Now go to Purview portal to download PST." -ForegroundColor Yellow } catch { Write-Log "Export failed: $_" } } # ================================ # Helper Queries (Templates) # ================================ function Show-QueryExamples { Write-Host "`n--- Query Examples ---" Write-Host "1. All emails: (leave blank)" Write-Host '2. From specific user: from:"user@domain.com"' Write-Host '3. Keyword search: "invoice"' Write-Host '4. Date range: received>=2024-01-01 AND received<=2024-12-31' Write-Host '5. Attachments only: hasattachment:true' } # ================================ # Menu # ================================ function Show-MainMenu { Clear-Host Write-Host "========================================" -ForegroundColor Cyan Write-Host " Compliance Search Tool (MSP Edition)" Write-Host "========================================" Write-Host "1. Connect" Write-Host "2. Create Search" Write-Host "3. Start Search" Write-Host "4. List Searches" Write-Host "5. Check Search Status" Write-Host "6. Export Search (PST Prep)" Write-Host "7. Delete Search" Write-Host "8. Query Examples" Write-Host "9. Disconnect" Write-Host "0. Exit" } # ================================ # Main Loop # ================================ do { Show-MainMenu $choice = Read-Host "Select option" switch ($choice) { 1 { Connect-Compliance } 2 { New-ComplianceSearchMenu } 3 { Start-ComplianceSearchMenu } 4 { Get-ComplianceSearchList } 5 { Get-ComplianceSearchStatus } 6 { Export-ComplianceSearchMenu } 7 { Remove-ComplianceSearchMenu } 8 { Show-QueryExamples } 9 { Disconnect-Compliance } } Pause } while ($choice -ne 0) Write-Host "Exiting..." -ForegroundColor Yellow