Skip to content

Kernel Migrator for Exchange(Express)-Review


Running a hosting business is not easy these days. Not only we have to compete with smaller firms but there are many big players out there : Amazon AWS, Microsoft Azure, Alicloud and etc…

10 years back, you probably heard of on-premises email hosting, hosted exchange server. But now, we have Office 365. Who would want to host their email servers with you when they can have email and office suite altogether and cheaper??

Recently, many companies have choose to migrate their emails and server somewhere…..the cloud….


Photo by Brett Sayles on

I was involved in a migration project , job was to migrate Exchange emails to Office 365. One of the criteria was : user will login to Office 365 using their old passwords.

Now, the technical garbage:

First thing I need to do was to download and install Microsoft Azure AD Connect. Configuration is pretty straightforward, but take note of the password writeback option.

Enable password writeback in Azure AD Connect

After this is done,  next step is to assigning license to the O365 user account. Having said that, you will have an error when you try to open the new mailbox :

“This user’s on-premises mailbox hasn’t been migrated to Exchange Online. The Exchange Online mailbox will be available after migration is completed.”

To resolve, this error, please read up this blog :

After verifying you can login to the mailbox using old password, the next thing you want to do is to disable password expiry in the O365 admin portal.


O365 password policy

Next, go ahead and install Kernel migrator for Exchange(Express). Installation is also pretty straightforward.

exchange migrator

Upon launching the app, your first Step is to Add Source.

In this screen, you will have to enter your on-premises Exchange account. Please ensure you have impersonation  rights assign.  Follow the powershell script on the right for instruction. For the Exchange server name, enter the hostname of your Exchange Server.

Next, list all mailboxes using the credential you provided and select the email addresses that you need to migrate.

add source

After this is done, you will do the same for Destination. For server name, leave it as default (

Next screen, map the source mailbox with the destination mailbox.


In the following screen, you can select which folder(s) to sync, exclude empty folders and incremental(we will address this later). When you ready, click Start Migration.

folder selection

The summary status will show the progress of the migration. From my experience, 10,000 items will require more than 10 hrs. The size of the mailbox doesn’t matter, it’s the items.


After the job is completed, you can export it as a csv for recording purpose.


Finally, you can login to Outlook Web Access(OWA) to verify the emails are migrated successfully.

outlook sample

The Review:

Okay, now let’s talk about this product.

There are a few products in the market that can migrate emails from exchange to office 365, one of them is Skykick, the other one is from CodeTwo, and then we have Migrator for Exchange.  We don’t like Skykick because of transparency, you can’t kick off the migration immediately, the migration job can only run 3 or more days later after you configure it. I got no clue why they make it this way.

CodeTwo, AFAIK , it doesn’t support incremental migration.

Hence, that’s the reason why we chose Migrator for Exchange over other products…..BUT !!!!

After performing hundred gigabytes of email data migration, we notice the incremental feature does not work !

In the next following screen, I screenshot contents of the app.

explorer content

Inside Migration History folder, displayed the jobs that were completed.

migration history

Inside duplicateDB, displayed info of emails migrated. But the content inside those files are encrypted.


So  I guessing in order for Migrator for Exchange to keep track what emails have been migrated, they write an encrypted file in a folder.  The next time you run the job again , it will look for this file, but this does not work really well…

well outside house

Photo by Frans Van Heerden on

Imagine you are going to migrate 1000 mailboxes, how many files are they going to write to this folder? There are currently 4000 over such files in my folder as we speak and we have only migrated 40 over mailboxes.  Also, what if you run on the app on anther server or PC, does the incremental feature work? NO, it does NOT !! Because those files are on another server/PC !!  Stupid isn’t it??

man person people emotions

Photo by Gratisography on

Shouldn’t it better if they use SQL express to keep track rather than simple files?

Another thing about the migration is the speed. 1000 emails will need 1 hrs to complete. 10,000 emails(approximate 10GB)  will need 10 hrs, slow or fast ? I let you decide.

So, how can we resolve this issue?  Well, luckily we can filter by date.  For example last week you performed a migration, if you need an incremental migration today, just filter the date from last week till today.


Another issue I noticed was if you have folders with “/” , it will be migrated as separate folders. For example information / info folder will be migrated as information and info separately.


old outlook folder list1

new outlook folder lists2

Calendar migration also got some issue. The attendees info wasn’t carry forward.

require attendees


require attendees2



The Clean Up:

If unluckily you notice there are thousand of duplicate items on a mailbox, you will need to run a 3rd party script. You can download it here :

Take note that the step of cleaning up duplicate items is beyond the scope of this review. But I can provide some pointers

1: This script won’t run on Exchange 2010, I ran it on Exchange 2016 to clean up items in Office 365.

2: To run the script against a mailbox, you need to have full access right to the mailbox.

3: For example:

$UserCredential = Get-Credential
C:\Program Files\Microsoft\Exchange\Web Services\2.2\.\Remove-DuplicateItems.ps1 -Mailbox -Server -mode full -nosize -Credentials $Credentials -verbose

Initially the script does not work coz i left out the -mode full.

The Extra:

Next, let me share with you some of the scripts that I  frequently used.

To connect to Office365 Exchange powershell:

$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session -DisableNameChecking

Get mailbox statistics:

Get-MailboxStatistics chrisong | ft DisplayName, TotalItemSize, ItemCount

Get-MailboxFolderStatistics -Identity chris -FolderScope inbox | ft name,itemsinfolder

To disable Azure AD Connect:

Install-Module -Name AzureAD
$msolcred = get-credential
connect-msolservice -credential $msolcred
Set-MsolDirSyncEnabled -EnableDirSync $false

Get information about AD user :

Get-ADUser -filter * -properties PasswordLastSet, PasswordExpired, PasswordNeverExpires | sort Name | ft Name, PasswordLastSet, PasswordExpired, PasswordNeverExpires

That’s all folks !





%d bloggers like this: