Migrate your Exchange 2010 to Exchange 2019 On-Prem – Part one (from 2010 to 2016)

I know that in the last two year all want to migrate yours Exchange infrastructures to the Microsoft’s cloud, but sometimes someone still asks to stay on-prem.

So, let’s go on this journey and start we me in this simple lab where, starting from an old Exchange 2010, we will reach the final step, passing Exchange 2016 , the Exchange 2019 On-Prem.

Our lab enviroment is made of:

  • One Windows 2019 Domain Controller
  • One Windows 2008 R2 Domain Joined
    • On which is installed Exchange 2010 Standard
  • A Windows 10 client fully configured to work with Exchange 2010 with Outlook 2019 connected to it

Some requirements

Exchange versionSO RequiredAD forest LevelCoexistance
Exchange 2010Windows Server 2008 R2Windows Server 2003Exchange 2003
Exchange 2007
Exchange 2016Windows Server 2012 R2 => Windows 2016 (don’t use Windows 2019)Windows Server 2012 R2Exchange 2010 SP3 UR11
Exchange 2013
Exchange 2019 Windows Server 2019 Windows Server 2012 R2Exchange 2013
Exchange 2016

The steps that we’ll go through are:

So now, let’s start.

Prepare your Win 2016 with all requirement (need also .NET Framework 4.8 , Visual C++ Redistributable Package for Visual Studio 2012 , Visual C++ Redistributable Package for Visual Studio 2013 and Microsoft Unified Communications Managed API 4.0)

Now, we will check our Domain/Forest level..

And we will raise to meet the minimal requirement (see table) About this command and forest level..

Check again, the result …

Now we’ll do some check on our Exchange 2010…

Check if Outlook Anywhere is enabled or not

So, enable it choosing the right name space (in our case is mail.labincloudres.com)

At this point we are ready to install our Exchange 2019…

Mount the ISO on the server where will install it and prepare the Domain and Forest…

If you need to find the Organization Name , issue this command on exchnage console…

Now we are ready to install our Exchange 2016


Now reboot check and change the SCP to point to autodiscover DNS record (that at this point is still Exchange 2010! ).

Change it to point to FQDN of autodiscover

Now check it again…

Now we have some things to do… set all virtual directories to the right FQDN and, before start, we can show the situation:

And so, we need all that is related to our new Exchange 2016..

Double check the MAPI (MapiVirtualDirectory) and OutlookAnywhere on your Exchange 2016.

Change it too

And, finally set OutlookAnywhere on the Exchange 2016…

Now, we need to export the SSL certificare from Exchange 2010 and importo to Exchange 2016

Remember that Exchange 2010 has a “bug” in the Export-ExchangeCertificate because “-path” is missing… so we need to fallow this useful suggestion from Nick

First extract from Exchange 2010 the thumbprint of the cerfificate.

Now, fallowing Nick, we will use these commands to export.

Now copy this exported certificate to your Exchange 2016, import it and assign to IIS and SMTP.

Set the default OAB per DB on the Exchange 2010

On Exchange 2016

Create an OAB for the Exchange 2016 DB

And set it as the default OAB for the Exchange 2016 DBs

Now we will do some task preparing to move mailboxes (NB disable Circular logging and increases database limits…) :

First we need to move the Arbitration mailboxes from 2010 to 2016 to avoid problem access to OAB after moving mailboxes..

At this point we could test a mailbox move, but, before, we can switch the DNS record to point to our Exchange 2016.

If you want only do a test with a pc, you could change the HOSTS file to force the resolution of SCP FQDN , in my case mail.labincloudres.com , to your Exchange 2016 instead of 2010

Now we will do a test moving a mailbox and check that everything works..

On the client side, Outlook popup a warning, you have to close and reopen Outlook.

So it works… now we proceed to move all mailbox with this command:

Before starting mooving all mailboxes, we need to garantee the ability, for moved mailboxes to access to Public Folders.

tO do this, we need to implement a PF Mailbox Proxy meccanism

  1. On the Exchage 2010 we need to create a DB dedicated to this particular topics

2. Now, we create a mailbox into this Db and hide it.

3. Now switch to your Exchange 2016 and change from Local to Remote pointing to previous mailbox created on Exchange 2010.

Now, we moved all the mailboxes and we will migrate the public folder.

first, download the script from Microsoft

  1. Now take a snapshot of Structure,Statistics and Permission. These XML will be useful later.

Now check if there are a previous migration in progress…

Now, we will map a drive on the Exchange 2010 that is pointed to a folder/share of Exchange 2016. We do this, because we need to launch the scripts from Exchange 2010, but we need to put the output on the Exchange 2016.

In my case i created a folder called PFMigration con C:\

Map it from Exchange 2010

Now, open an Ex Console with Admin rights, and launch the first script

Now we can open the CSV just created to see the “size” of the current PF. in my case i have only 133.967 Byte that correspond to 0,13 Mb.. very small, but this is a LAB. Basically, you need to make a total to know how you will need to specify in the second script to permit “the public folder mailbox has room to grow.

Now we run the script that will create a CSV to map the PF to a mailbox/mailboxes

At this point we need to create the Public Folder Mailbox on the Exchange 2016, so, this command will be executed on the Exchange 2016 console <<<<!!!!

Now issue the command to start the migration.

Set limits and start the batch

Check the status..

Check also the report sent to the mail address specified on the batch..

So, we are ready to finish or migration.

Go back to Exchange 2010 console and lock down the public folder. (this interrupt normal users operations on the public folders…. Do it off hours if you can.)

Now, go back to Exchange 2016 console and finalize the migration batch…

Note that in this case , with the “complete-migrationbatch” system return and error.. to resolve it quickly, restart the Information Store on the Exchange 2010.

After restarted, everything works.

Now the final steps..

Test the outlook…


Decommissioning exchange 2010.

I assumed that you moved/repoint receive and sent connectors

So now we remove the public and private DBs.

Do the same for the MailboxDb

Remove the OAB

Now, finally, uninstall it.

Finally check the presence of the Exchage server.





  1. Hi, How remove PF-PROXY database after migration ? When i try remove i have error

    “This mailbox database contains one or more mailboxes, mailbox plans, archive mailboxes, public folder mailboxes or arbitration mailboxes, Audit mailboxes. “


Leave a Reply

Your email address will not be published. Required fields are marked *