I think that almost every Exchange admin can concur with me that the Outlook autocomplete cache is one of those things you love but at the same time also hate.
Users mostly love this function, except when it fails.
Luckily since Outlook 2010 things got a little better and we got rid of the dreaded nk2 files.
Outlook 2010 now includes a folder named "Suggested Contacts", all users you send an email to and that don't already have an contact object are saved in this suggested contacts folder.
A lot of people thought this folder is also the source for the autocomplete cache, which would make it somewhat easy to manage, I wish the solution was that easy.
Badly enough separate from the suggested contacts, outlook still maintains a cache for the autocomplete function.
Let us say you run in to the following situation:
John works for company A and is a popular contact for almost everyone in your organization.
Now John quit his job at Company A and moved to Company B.
Luckily John maintains your company as customer, but his email address is now changed from companyA.com to companyB.com
Since you don't want to do any business with Company A anymore, you want to make sure none of your users accidentally mail to his old address.
Now this is where the real fun starts, cause almost all of your 1000 users have mailed at least once with John.
Resulting in the fact that every user has John most probably listed in their autocomplete cache.
I have run into sort like situations multiple times with several customers, which is always a pain.
And of course this blog post is the result of one of those issues once again.
I knew that with the Suggested contacts we could do more than previously, but still never spent time on it before.
But today I thought lets nail this now and forever!!
Ok let's start of that things are different for every combination of outlook and exchange.
I explain the procedure for Exchange 2010 SP1+ in combination with Outlook 2010.
At first we want to get rid of all contact objects that contain email@example.com
To do this we need to be assigned to the RBAC role "Mailbox Import Export", which can be done through the Exchange Control panel.
In my test environment I assigned this role to the Organization admins, but in real life you might want to add it to a custom role.
Open the Exchange control panel by logging in to the ecp url, in my case https://ITFEX.itf.local/ECP, and make sure you selected your organization as management scope.
Browse to Roles & Auditing, and open the properties for the organization management role group.
click on the Add button to add a new role to the Organization Management role group, select the Mailbox Import Export role and click on add and OK to add it to the role.
Once you have assigned that role to your account you can open the Exchange Management Shell and execute the following command:
Get-mailbox –resultsize unlimited | search-mailbox –targetmailbox "your.account" –targetfolder searchanddelete –loglevel full –logonly –searchquery "kind:contact AND firstname.lastname@example.org"
This command will create a list with all mailboxes and any contacts that were found with an email address that contains email@example.com, this list is then posted in the mailbox you specified at your.account in the folder searchanddelete.
Now examine the report that was created and posted in the mailbox to see if it matches what you think it should match.
My results looked like this:
When you're confident that the search includes all references and no false positives you can execute almost the same command, but this time with an delete action instead of the logonly.
Get-mailbox –resultsize unlimited | search-mailbox –targetmailbox "your.account" –targetfolder searchanddelete –loglevel full –DeleteContent –searchquery "kind:contact AND firstname.lastname@example.org"
Now most people would think this would remove the contact object from the suggested contacts, resulting in a removal from the autocomplete list.
Sad but not true, to clean up the autocomplete list start Outlook with the command: "outlook /cleanautocompletecache"
This will result in an empty cache, but luckily this is rebuild based on the suggested contacts, which now doesn't include the email@example.com contact anymore.