When looking at the title of this post, one might notice I used a target word, and it is on purpose. This script below is useful when trying to remove all types of messages from users’ mailboxes whether it’s a spam, scam, virus or a an important message that needs to be “recalled”.
This script is based on Search-Mailbox cmdlet, works well but it has its own pros and cons, more on some of them below.
Later I will have another post showing a different and more advanced script to do the same and even better. So stay tuned.
Pros:
- Doesn’t search through Purged Items (a bit more about the 3rd layer of Trash is here – https://365basics.com/script-to-search-through-recoverable-and-purged-items-and-restore-those/ ).
- Can copy messages to another mailbox (IT Help in that example).
Cons:
- Per Microsoft Search-Mailbox will be depreciated, we don’t know when it will happen though.
- Slow (if a target message is in every mailbox, then it will take about 20 minutes to run through 100 mailboxes and remove that message).
Don’t forget to replace ithelp@contoso.com with an email address of your IT Help or any other mailbox (!).
$fromemail = Read-Host "From (email)" $subject = Read-Host "Part of the subject line" $date = Read-Host "Date (e.g. 'No preceding Zeros in date' 7/11/2018 - the search will go through [Your entered date]...[Todays Date] time window)" If ($fromemail -eq '') { $Query = "Subject:""*" + $subject + "*"" received>=" + $date } ElseIf ($subject -eq '') { $Query = "From:" + $fromemail + " received>=" + $date } Else { $Query = "From:""" + $fromemail + """ Subject:""*" + $subject + "*"" received>=" + $date } $Mailboxes = Get-Mailbox -ResultSize unlimited | Where-Object {$_.recipienttypedetails -ne "RoomMailbox" -and $_.recipienttypedetails -ne "EquipmentMailbox"} $FilteredResults = ForEach ($Mailbox in $Mailboxes) { Search-Mailbox -Identity $Mailbox.DisplayName -SearchQuery $Query -SearchDumpster -EstimateResultOnly | Where-Object {$_.ResultItemsCount -gt 0} } Write-host "List of mailboxes matching the search criteria:" $FilteredResults | fl $Answer = Read-Host "Would you like to move those messages from listed above mailboxes into IT Help mailbox - Check folder (y / n)?" while("y","n" -notcontains $answer) {$answer = Read-Host "Would you like to move those messages from listed above mailboxes into IT Help mailbox - Check folder (y / n)?"} If ($answer -eq 'y') { ForEach ($Result in $FilteredResults) { Search-Mailbox -Identity $Result.Identity -SearchQuery $Query -SearchDumpster -TargetMailbox ithelp@contoso.com -TargetFolder Check -DeleteContent -Confirm:$false -Force } Remove-Variable * -ErrorAction SilentlyContinue } Else { Remove-Variable * -ErrorAction SilentlyContinue }
Pingback: PowerShell - New-ComplianceSearch script to go through all mailboxes, find a target message, and remove it - Office 365 Basics