# Clean-ProxyAddress.ps1 # #Scan for all MailUser and MaiContact and remove AcceptedDomain Addresses from ProxyAddresses # # Required: Exchange PowerShell [CmdletBinding(SupportsShouldProcess=$True)] # Support für WhatIf param ( [Parameter(ValueFromPipeline=$true)] [object[]]$recipients, # contains objects [string]$csvfilename = ".\changes.csv", # wrsite all modifications [switch]$delete, # set to true to delete [switch]$confirmdelete # set t true to get asked for deletion ) begin { Write-host "Remove-Proxaddresses: Start" $ErrorActionPreference = "Stop" set-adserversettings -ViewEntireForest $true Write-host " Parameter DeleteMails: $($deletemail)" Write-host " Collect Accepted Domains" $accepteddomains = (Get-AcceptedDomain).Domainname.domain Write-host " Total Domains: $($accepteddomains.count)" } Process { Write-Host "=========== Process =====================" if ($null -eq $recipients) { Write-Host " No Objects in Pipeline - collet MailUser and MailContacts" $recipients = (Get-MailUser -ResultSize unlimited) + (get-mailcontact -ResultSize unlimited) Write-Host " Total Recipients $($recipients.count)" } else { Write-Host " Recipient from Pipeline" } foreach ($object in $recipients) { Write-Host "Processing: $($object.PrimarySMTPAddress)" -ForegroundColor white Write-Host " Check if Primary Address is in Accepted Domain for: $($object.PrimarySMTPAddress.domain )" -nonewline if ($object.PrimarySMTPAddress.domain -in $accepteddomains) { Write-Host " Assume internal Contact - SKIP" -foregroundcolor Gray } else { Write-Host " Domain in not AcceptedDomains. OK" -foregroundcolor green Write-Host " Check ExternalEmailAddress in AcceptedDomain $($object.ExternalEmailAddress)" -NoNewline if (($object.ExternalEmailAddress.AddressString.split("@"))[1] -in $accepteddomains) { Write-Host " ExternalEmailAddress is in AcceptedDomains - SKIP" -foregroundcolor DarkYellow } else { Write-Host " ExternalEmailAddress is NOT in AcceptedDomains" -foregroundcolor Green $proxyaddresses = $object.emailaddresses foreach ($proxyaddress in $proxyaddresses) { Write-Host " Check ProxyAddress:$($proxyaddress) with Prefix $($proxyaddress.prefixstring))" -NoNewline $result = [pscustomobject][ordered]@{ Timestamp = ([System.DateTime]::UtcNow).tostring("u") PrimarySMTPAddress = [string]$object.PrimarySMTPAddress ExternalEmailAddress = [string]$object.ExternalEmailAddress recipienttypedetails = [string]$object.recipienttypedetails proxyaddress = [string]$proxyaddress deletestatus = "" } if ($proxyaddress.prefixstring -ne "smtp") { Write-Host "Skip NONSMTP" -ForegroundColor DarkYellow $result.deletestatus ="SkipNoSMTP" } else { if ($proxyaddress.smtpaddress.split("@")[1] -notin $accepteddomains) { Write-Host "Found NotInternal Domain - SKIP" -ForegroundColor DarkYellow $result.deletestatus ="SkipNotInternal" } else { Write-Host "Found Internal Domain - REMOVEPENDING" -ForegroundColor Magenta $result.deletestatus ="REMOVEPENDING" $dodeletion=$true if (!$delete) { Write-Host "DELETE not executed due missing delete option" -ForegroundColor yellow $dodeletion = $False $result.deletestatus ="REMOVEPENDING1" } else { $result.deletestatus ="REMOVEPENDING2" if ($confirmdelete) { $dodeletion = (Read-Host "Delete? (Y/N)").toupper() -eq "Y" Write-Host "DELETE after Readhost $($dodeletion)" $result.deletestatus ="REMOVECONFIRM$($dodeletion)" } } if ($dodeletion) { $result.deletestatus ="REMOVESTART" Write-Host " Start Deleting Proxy Address" -ForegroundColor Magenta switch ($object.recipienttypedetails) { "MailUser" { Write-Host "Removing Address from MailUser $($ProxyAddress)" -ForegroundColor white -BackgroundColor blue #Set-Mailuser -Identity $object.identity -Emailaddresses @{Remove=$ProxyAddress} $result.deletestatus ="REMOVED" } "MailContact" { Write-Host "Removing Address from MailContact $($ProxyAddress)" -ForegroundColor white -BackgroundColor blue #Set-MailContact -Identity $object.identity -Emailaddresses @{Remove=$ProxyAddress} $result.deletestatus ="REMOVED" } Default { Write-Host "Ignoring Recipienttypedetails $($object.recipienttypedetails) - SKIP" -ForegroundColor yellow $result.deletestatus ="IgnoredRecipienttype" } } } } } Write-Host " Add Status to CSVFile $($csvfilename)" $result | Export-Csv -Path $csvfilename -append -NoTypeInformation } } } } } End { Write-host "Remove-Proxaddresses: Start" }