EDIT: Search-Mailbox has been deprecated as of April 2020 in 365. Please see my updated post that about using Compliance Search instead!
Overview
Often times, my posts are influenced by the questions of others in IT forums. The other day, an IT pro asked “How can I retrieve emails a 365 user sent to a certain recipient”? Obviously, I thought to myself, there should be a way to search a mailbox with powershell. While writing the small script to answer their question, I realized I could do more than just search and copy with the search-mailbox cmdlet.
- Search recoverable items. This can be useful if a terminated employee deleted important emails that their manager needs.
- Delete Emails. This can useful for a scenario where a virus makes it to all user’s inbox or a disgruntled employee emails a nasty email to everyone.
- There’s a TON of properties indexed by Exchange that you can query
Without further ado, let’s get to the script
Prerequisites
- .NET Framework (4.5 as of this writing)
- Microsoft Online Services Sign-In Assistant for IT Professionals RTW
- Azure Active Directory Module for Windows PowerShell
Delegate Full Access to Mailboxes
In order to search mailboxes, you’ll need to ensure your account has Full Access to each user’s mailbox. You can do this through the 365 Exchange Admin Center, or you can give yourself full access to all user’s mailbox with the following powershell script. Make sure you authenticate using an Exchange Admin and replace bsteinmeyer@yourdomain.onmicrosoft.com with the account you need to delegate access.
#Connect to 365 with Admin Credentials $UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection Import-PSSession $Session #Delegate Full Access to All Mailboxes Get-Mailbox -ResultSize unlimited -Filter {(RecipientTypeDetails -eq 'UserMailbox')} | Add-MailboxPermission -User [email protected] -AccessRights FullAccess -InheritanceType all
Search Mailbox For Email Sent to a Specific Email
#Connect to 365 with Admin Credentials $UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection Import-PSSession $Session #Search Mailbox Get-Mailbox [email protected] | Search-Mailbox -SearchQuery "To:[email protected]" -TargetMailbox [email protected] -TargetFolder "Search_Result" -LogLevel Full –SearchDumpster
- [email protected] = User’s mailbox you want to search
- [email protected] = Email address sent to
- [email protected] = The Mailbox you want to copy the emails to
- SearchDumpster = Search recoverable items (Emails that were deleted from the Trash)
- *Note: If you only want to test the command and NOT copy anything, you can add the -LogOnly switch
The above will search a specified user’s mailbox for all emails sent to the specified email address. The results and emails will be copied to the specified mailbox in the specified folder (This will most likely be your admin account). If the folder does not exist, it will be automatically created.
Search All Mailboxes for Specific Email and Delete It
In order to delete emails with the -DeleteContent switch, you must be assigned the Discovery Management role and Mailbox Import Export role. By default, the Mailbox Import Export role isn’t assigned to any role group, so we’ll need to create a new group and assign our user.
#Query Discovery Management Members Get-RoleGroupMember -Identity "Discovery Management" #Assign Discovery Management Member Add-RoleGroupMember -Identity "Discovery Management" -Member [email protected] #Create Mailbox Import Export Management Group New-RoleGroup "Mailbox Import-Export Management" -Roles "Mailbox Import Export" #Add User to Mailbox Import Export Management Group Add-RoleGroupMember "Mailbox Import-Export Management" -Member [email protected]
With that complete, we can now search everyone’s email by the subject and date and delete it.
Get-Mailbox -ResultSize Unlimited | Search-Mailbox -SearchQuery {Subject:"You're a Winner!" AND Sent:"5/14/2015"} -DeleteContent -LogLevel Full –SearchDumpster
*Note: If you only want to test the command and NOT delete anything, you can add the -LogOnly switch
Final Comments
If you’d like to further refine your queries or do more advanced queries, see the complete message properties indexed by Exchange Search below:
https://technet.microsoft.com/en-us/library/jj983804(v=exchg.150).aspx
4 comments
1 pings
Skip to comment form
I get the following
Search-Mailbox
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Search-Mailbox:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Author
You’ll probably need to add yourself to the “Discovery Management” group.
#Query Discovery Management Members
Get-RoleGroupMember -Identity “Discovery Management”
#Assign Discovery Management Member
Add-RoleGroupMember -Identity “Discovery Management” -Member [email protected]
I’ve added the discovery management role to my account, but how do I import the module that includes the cmdlet search-mailbox? Thanks!!
Author
That’s only half of it, you need to also be a member of “Mailbox Import-Export Management”. From the directions above, it shows how to add a group with that role and assign an account as a member of that group:
#Create Mailbox Import Export Management Group
New-RoleGroup “Mailbox Import-Export Management” -Roles “Mailbox Import Export”
#Add User to Mailbox Import Export Management Group
Add-RoleGroupMember “Mailbox Import-Export Management” -Member [email protected]
[…] remove emails across all of your user’s mailboxes. Compliance searches have replaced the Search-Mailbox cmdlet, which has been deprecated as of April […]