Exchange Server 2007 users can seamlessly transition their on-premises mailboxes to Office 365 using the staged migration method, while Exchange Server 2010 offers the cutover migration approach for mailbox migration. However, it's important to note that both of these methods are specifically tailored for migrating primary mailboxes. The primary mailbox content is efficiently moved to Office 365, making it readily accessible for immediate use.

If you're looking to migrate public folders associated with your accounts, you'll need to explore additional methods that not only ensure the security of this shared data but also facilitate a smooth migration to the target account.

Bussines Man
Instant Solution

Download automated tool Kernel Migration for Exchange to migrate Exchange Server 2007, 2010, 2013, 2016 and 2019 Public Folders to Office 365.

Generate the Public Folder Mailboxes in Exchange Online

Migration from public folder to Office 365 can be categorized into 10 sufficient steps:

You are in for a bumpy ride!

Download the Migration Scripts

Unfortunately, there is no easy tool provided by Microsoft to do the migration, we must use a collection of PowerShell scripts and cmdlets to do the work for us.

Download all the following scripts;

Save them all to C:\PFScripts feel free to change this location but make sure all the scripts are in the same place.

Update Exchange Server

Only the following versions of Exchange server are supported by these scripts

  • Exchange 2010 with SP3 and at least RU8
  • Exchange 2007 with SP3 and at least RU15

If you don’t have these versions of Exchange you will have to upgrade and unfortunately if you have Exchange 2003 you can’t migrate your public folders to Exchange Online.

Prepare Exchange Server

You need to follow the following steps on your Exchange server before attempting the migration, if you miss any of these the scripts won’t work properly.

General Steps:

  • Make sure no orphaned public folders exist in AD (i.e. there are AD Objects for public folders that no longer exists)
  • Check that the SMTP address for any public folder objects in Exchange match the AD Objects
  • Remove any duplicate public folder objects in AD (If you have performed say a 2003 to 2007 public folder migration before it's common to have something like "FolderName" & "FolderName54334533" in AD for the same public folder
Exchange Server Steps

Run the through the following steps on the Exchange Server that you are migrating the public folders from

  1. We have to add the onmicrosoft domain for your 365 tenant to the Exchange server. To do this open the Exchange Shell as an administrator and type this

    New-AcceptedDomain -Name "PublicFolderDestination_OnMicrosoft" -DomainName -DomainType InternalRelay

  2. We need to find any public folder names with backslashes in, to do this,
    1. On Exchange 2010 run

      Get-PublicFolderStatistics -ResultSize Unlimited | Where {( $_ .Name -like "*\*" ) -or ( $_ .Name -like "*/*") } | Format-List Name, Identity

    2. On Exchange 2007 run

      Get-PublicFolderDatabase | ForEach { Get-PublicFolderStatistics -Server $_ .Server | Where { $_ .Name -like "*\*" }}

    3. Then simply remove the backslash from any folders that it finds.
  3. Make sure there isn’t any remnants of a previous failed or successful Public Folder Migration
    1. Run this command to check the Public Folder Migration Status

      Get-OrganizationConfig | Format-List PublicFoldersLockedforMigration , PublicFolderMigrationComplete

    2. If either PublicFoldersLockedforMigration or PublicFolderMigrationComplete shows as $true then you need to run this to reset the value

      Set-OrganizationConfig -PublicFoldersLockedforMigration: $false -PublicFolderMigrationComplete: $false

    3. Once you’ve reset the migration status you have to wait for these settings to refresh in Exchange, this could take a couple of hours.
  4. If you are using Azure AD connect you must remove public folder objects from the sync.
    1. Open Azure AD Connect
    2. Under Additional Task select Customize Synchronization options
    3. Enter your credentials
    4. On the Optional Features screen make sure the Exchange Mail Public Folders is unticked
Prepare Exchange Online

Now that the Exchange Server is ready to go it’s time to move onto setting up Exchange Online.

  1. Make sure there are no pre-existing public folder migration requests, if there are delete them.
  2. Check that there are no public folder mailboxes already in Exchange Online, if there are check for existing public folders. You will want to remove any public folders and public folder mailboxes before carrying on.
Generate the migration files

Time to dig out those scripts! Create a folder called C:\PFMigration and then open an Exchange Management shell change directory to the scripts directory (C:\PFScripts) now run the following scripts

  1. .\Export-PublicFolderStatistics.ps1 "C:\PFMigration\foldertosizemap.csv" "exchangeserver.domain.local"

    (make sure to change the name here to the name of your server)
  2. .\PublicFolderToMailboxMapGenerator.ps1 16106127360 "C:\PFMigration\foldertosizemap.csv" "C:\PFMigration\foldertomailboxmap.csv"

Have a look through your folder to mailbox map file, if there are more than 1000 rows you will need to simplify your public folder layout.

Generate the Public Folder mailboxes in Exchange Online

Next, we need to create the public folder mailboxes in Exchange Online, these mailboxes are what actually host the content for your public folders. To do this it’s more PowerShell commands so open up the Exchange shell and run

.\Create-PublicFolderMailboxesForMigration.ps1 -FolderMappingCsv C:\PFmigration\foldertosizemap.csv -EstimatedNumberOfConcurrentUsers: > estimate >

Update the estimate with the max number of concurrent users you expect, this isn’t massively important but it might help performance in bigger organisations.

Start the Migration Request

Up until now everything has been prep work for this stage, now it’s time to start syncing our data.

  1. Synchronize the mail enabled public folders, run this on the old Exchange server. Use your Office 365 Admin account credentials when prompted.

    Sync-MailPublicFolders.ps1 -Credential ( Get-Credential ) -CsvSummaryFile: C:\PFMigration\synclog.csv

  2. We need to get some more information before we can run the migration
    1. Find the LegacyExchangeDN of your Exchange Admin account

      Get-Mailbox > ExchangeAdminAccount> | Select-Object LegacyExchangeDN

    2. Get the ExchangeLegacyDN of the Mailbox Server that hosts the public folder database

      Get-ExchangeServer > exchangeservername> | Select-Object -Expand ExchangeLegacyDN

    3. Find the FQDN of the Outlook anywhere URL.

      Get-OutlookAnywhere | Format-Table Identity,ExternalHostName

  3. Now switch to Office 365 PowerShell, it’s time to update the info we just got into Exchange Online, first we need to set some values, then we can actually create the migration request!
    1. Get the credential of the old Exchange server admin

      $Source_Credential = Get-Credential domain\exchangeadmin

    2. Get the Legacy Exchange DN from above for this same user

      $Source_RemoteMailboxLegacyDN = "userDNgoeshere"

    3. Get the Legacy Exchange DN for the server from above

      $Source_RemotePublicFolderServerLegacyDN = "serverDNgoeshere"

    4. Get the FQDN for Outlook Anywhere from above

      $Source_OutlookAnywhereExternalHostName = "OutlookFQDN"

  4. At last, we can create the migration request (again in Office 365 Shell)

    $PfEndpoint = New-MigrationEndpoint -PublicFolder -Name
    PublicFolderEndpoint -RPCProxyServer
    $Source_OutlookAnywhereExternalHostName -Credentials $Source_Credential
    -SourceMailboxLegacyDN $Source_RemoteMailboxLegacyDN

    $Source_RemotePublicFolderServerLegacyDN -Authentication Basic

    [byte[]] $bytes = Get-Content -Encoding Byte

    New-MigrationBatch -Name PublicFolderMigration -CSVData $bytes
    -SourceEndpoint $PfEndpoint.Identity -NotificationEmails

  5. Finally, start the migration process

    Start-MigrationBatch PublicFolderMigration

We are getting there! But don’t say I didn’t warn you about this being a complicated process. At this stage, we can actually use the EAC to check in on the Migration Process

  1. Login to EAC (Office 365)
  2. Go to Mailbox > Migration
  3. Find the migration that you just created and click view details

Only 3 steps left!

Lock down the public folders on the old Exchange server

We must prevent users from updating, editing, or accessing the old public folders, as any changes they make won't synchronize. The duration of the migration process may vary depending on factors such as data volume, Exchange server performance, and available bandwidth. During this period, Public Folders will essentially be offline, causing incoming mail to queue up, and users will be unable to access them. It's essential to plan for this downtime. Now, let's return to the command shell on the old Exchange server.

Set-OrganizationConfig -PublicFoldersLockedForMigration: $true

Public folders are now locked, if you have multiple public folder servers you will have to wait for them to replicate before continuing.

Finalize the migration

We are so close at this point I can practically taste it, time to finish the migration. Once you run this command, Exchange does one final sync of the data and then that’s it. In 365 Shell run this

Complete-MigrationBatch PublicFolderMigration

If you have Hybrid Exchange you will also need to run this

Set-OrganizationConfig -RemotePublicFolderMailboxes $Null -PublicFoldersEnabled Local

Test the migration and unlock the public folders for users

We are finally done, time to test! Run all these commands in 365 Shell.

Run this command to give yourself access to the public folders.

Set-Mailbox -Identity > Test User < -DefaultPublicFolderMailbox > Public Folder Mailbox Identity >

Login to outlook, if the public folders look ok to you then it’s time to give everyone else access.

Get-Mailbox -PublicFolder | Set-Mailbox -PublicFolder -IsExcludedFromServingHierarchy $false

Everyone will now have access to the public folders through outlook (assuming they had permissions to do so before the migration). Finally run this command

Set-OrganizationConfig -PublicFoldersEnabled Local

That’s it. Done.

If you do not want to go through this tiresome process, then you can always choose a much safer option - a third-party tool like Kernel Migration for Exchange which conducts a flawless migration of public folder to Office 365. With this Exchange Migration tool, You can choose to run a pre-migration analysis to know the possible migration time. Also, it synchronizes source and destination data and migrates limits and permissions too.

To understand how Kernel Migration for Exchange performs a swift migration, first download and install the application and then follow the given steps:

  1. Start the Kernel Migration for Exchange software application. Click on the Add Project option to add a project for the migration process. Enter a project name and click OK. A migration project will be created. Now click on Add Job for Public folders. Kernel Migration for Exchange
  2. Provide a job name and click Next. Provide a job name
  3. Enter the source domain (Exchange 2010) login details. Perform validation of the details with Validate option. With this tool, you can Use existing profile and also delegate owner rights to this user on public folder(s). After providing the complete information, click Next. Enter the source domain
  4. Select the public folders you want to migrate from the list and click Next. Select the public folders
  5. In the next dialogue box, enter the target domain (Office 365 account) details like username and password. Here also, you can validate the details. If required, use the existing profile and finally click Next. enter the target domain
  6. Users can filter the data with filters like Message classes, Date range, etc. After filtering, click Next. enter the target domain
  7. Users can manage bad items and synchronization settings with the options provided. Then click Next. synchronization settings
  8. Set the job notifications by providing the email address (if needed) and click Next. Set the job
  9. Confirm the job details given in the summary and click Finish to start the migration. start the migration

The duration of the migration process may vary depending on the volume of data to be transferred. Once the migration of Exchange public folders to Office 365 has concluded, you will see the migration status reflected as either "completed" or "successful."


While there exist manual methods for migrating public folders to Office 365 from older Exchange versions, the preference among Exchange administrators leans heavily towards employing professional tools. In this article, readers will gain insight into the seamless migration capabilities of Kernel Migration for Exchange with regard to public folders. This versatile tool not only streamlines migrations between different Exchange versions but also extends its support to facilitate seamless transitions from Office 365 to On-premise Exchange and between two distinct Office 365 tenants.