http://www.microsoft.com/en-us/download/details.aspx?id=38176
http://blogs.technet.com/b/scottschnoll/archive/2013/04/02/high-availabilitychanges-in-exchange-server-2013-cumulative-update-1.aspx
http://blogs.technet.com/b/exchange/archive/2013/02/08/servicing-exchange-2013.aspx
A live demo of public folder migrations from Exchange 2010 SP3 to Exchange 2013 CU1 was performed in a lab environment during the meeting. The following slides attempt to include every PowerShell cmdlet utilized during that demonstration as well as including as many screen shots as possible.
Notice Microsoft is still refining some areas of public folder migration to Exchange 2013 to improve and where possible simplify the process. You may see differences in this presentation compared to what is currently published on TechNet. You may also see additional updates to TechNet made after this presentation was originally given on May 1 st 2013.
Public folder architecture updated Migrate users to 2013 before Public Folders
Public folder migrations are an 8 step process. 1. Prepare for the migration 2. Generate files to aid the migration process 3. Create your public folder mailboxes 4. Start the migration request 5. Lock legacy public folders for completion 6. Finalize the migration request 7. Test / Validate 8. Remove legacy public folder databases
1. Are all users moved to Exchange 2013? You *could* pre-stage your PF data while you re still moving users to 2013 if you have huge amounts of PF data 2. Are all Exchange 2007 servers running SP3 RU10? 3. Are all Exchange 2007 servers running PowerShell v2.0? 4. Are all Exchange 2010 servers running SP3? 5. Have we done a recent backup? 6. Is the user executing the steps an Organization manager? 7. Do we have any public folders with backslashes \ in their name? 8. Do I have the latest PF PowerShell migration scripts? http://www.microsoft.com/en-us/download/details.aspx?id=38407
Analyze existing legacy Public Folders (commands executed on legacy server) Folder Structure: Get-PublicFolder -Recurse Export-CSV C:\PFMigration\Ex2010_PFStructure.csv Folder Statistics: Get-PublicFolder -Recurse Get-PublicFolderStatistics Export-CSV C:\PFMigration\Ex2010_PFStatistics.csv Folder Permissions: Get-PublicFolder -Recurse Get-PublicFolderClientPermission Select-Object Identity,User -ExpandProperty AccessRights Export-CSV C:\PFMigration\Ex2010_PFPerms.csv
Check for previous PF migrations (commands executed on legacy server) Get-OrganizationConfig Format-List PublicFoldersLockedforMigration, PublicFolderMigrationComplete If either are True, talk with other admins to find out why. They must both be False to proceed. To set to False, run this command on the legacy server. It may take up to 2 hours to take effect (AD replication + Information Store cache timeout). Set-OrganizationConfig -PublicFoldersLockedforMigration:$False -PublicFolderMigrationComplete:$False
Check for previous migration requests (command executed on 2013 server) Get-PublicFolderMigrationRequest If you see a request, talk with other admins to find out why. Only one can exist so you would have to remove it. Get-PublicFolderMigrationRequest Remove-PublicFolderMigrationRequest -Confirm:$False
Check for public folder mailboxes (command executed on 2013 server) Get-Mailbox PublicFolder If you see public folder mailboxes, talk with other admins to find out why. You ll want to delete these if you re starting a migration over. Remove all public folder mailboxes from Exchange 2013 before proceeding Get-Mailbox -PublicFolder Where{$_.IsRootPublicFolderMailbox -eq $false} Remove-Mailbox -PublicFolder -Force -Confirm:$false Get-Mailbox -PublicFolder Remove-Mailbox -PublicFolder -Force -Confirm:$false Note :The Force switch is used above to skip dependency checks like mail enabled folders and public folders residing in the Exchange 2013 public folder mailboxes. This prevents us from having to mail-disable any existing Exchange 2013 public folders prior to the rollback, which would delete the related system objects in the MESO container and remove distribution group memberships and email addresses. With Force used this is no longer a problem and DG memberships and addresses are kept intact.
Export your PF statistics (command executed on legacy server).\export-publicfolderstatistics.ps1 <Folder to size map path> <FQDN of source server>
You now have a.csv file with the folder name and size in bytes for each folder.
Create a PF to PF Mailbox mapping file (command executed on legacy server).\publicfoldertomailboxmapgenerator.ps1 <Maximum mailbox size in bytes> <Folder to size map path> <Folder to mailbox map path> Example shows a desired 175 MB maximum public folder mailbox. Note: Backslashes \ in public folder names will not work with this script. You should remove backslashes from public folder names prior to going through the migration.
You now have a.xml file with the public folder to mailbox mapping How to read this. Everything under the root \ will go into Mailbox1 except for the exclusions. Legal Affairs and Sales along with their subfolders will go into Mailbox 2. Project Warehouse and its subfolders will go into Mailbox 3.
If you desire, edit the mapping file to fit your naming standards. Create the first public folder mailbox in migration hold mode. (command done on 2013) New-Mailbox -PublicFolder <Name> -HoldForMigration IsExcludedFromServingHierarchy:$True Create your other public folder mailboxes w/o HoldForMigration as this is only for the 1 st PF Mailbox.
If you have to create a lot of public folder mailboxes, this example script may help. $numberofmailboxes = 3; for($index = 1 ; $index -le $numberofmailboxes ; $index++) { $PFMailboxName = "PFMBX-00"+$index; if($index -eq 1) { New-Mailbox -PublicFolder $PFMailboxName HoldForMigration:$true IsExcludedFromServingHierarchy:$true; } else { New-Mailbox -PublicFolder $PFMailboxName IsExcludedFromServingHierarchy:$true } }
Copy the mapping file to the 2013 server, or make it available over the network. Create a public folder migration request (command executed on 2013 server) New-PublicFolderMigrationRequest -SourceDatabase (Get-PublicFolderDatabase -Server <Source server name>) -CSVData (Get-Content <Folder to mailbox map path> -Encoding Byte)
Check the status of your migration request. (command run from 2013 server) Get-PublicFolderMigrationRequest Get-PublicFolderMigrationRequestStatistics -IncludeReport Format-List ^--Very verbose My preferred quick-glance view (command run from 2013 server) Get-PublicFolderMigrationRequest Get-PublicFolderMigrationRequestStatistics -IncludeReport FT Name,BytesTransferred,Items*,Percent*,Status AutoSize
Eventually you ll reach AutoSuspended state How long did it take? Get-PublicFolderMigrationRequest Get-PublicFolderMigrationRequestStatistics -IncludeReport Format-List *duration*,*timestamp*
What if it took days? Run a delta-sync! (command run from 2013 server) Get-PublicFolderMigrationRequest Resume-PublicFolderMigrationRequest Notice the ItemsTransferred has gone up and we are back in AutoSuspended. We will always go back into the AutoSuspended state until the finalization step is run.
Lock the legacy public folder infrastructure, user access prevented starting now. (command run from legacy server) Set-OrganizationConfig -PublicFoldersLockedForMigration:$True To confirm it took place. Get-OrganizationConfig fl *pub* It may take up to 2 hours to lock everyone out. AD replication + Information Store Cache Allow enough time for final changes to be replicated among all legacy PF servers before moving on.
First, allow the migration request to complete, but reconfiguring it. (command run from 2013 server) Set-PublicFolderMigrationRequest -Identity \PublicFolderMigration -PreventCompletion:$False Second, resume the request one last time. (command run from 2013 server) Resume-PublicFolderMigrationRequest -Identity \PublicFolderMigration
Third, continue checking the progress until completion. (command run from 2013 server) Get-PublicFolderMigrationRequest Get-PublicFolderMigrationRequestStatistics -IncludeReport FT Name,BytesTransferred,Items*,Percent*,Status AutoSize It may take a while, be patient. Note: TechNet currently has steps 6/7 backwards for legacy on-prem to 2013 on-prem PF migrations. The article will probably be updated by 5/9/2013.
At this point your legacy PFs are dormant, and your Exchange 2013 PFs are blocked from client connections. First, override the IsExcludedFromServingHierarchy block on the PF mailboxes by defining a default PF mailbox for a test user. (command run on 2013 server) Set-Mailbox <TestUserID> -DefaultPublicFolderMailbox <PFMBXID> Second, open Outlook with your test user and look at the connection status. A server name in the format of GUID@primarysmtpdomain proves we are connected to Exchange 2013. It may take a few minutes to take effect. 2013 PF Connection Legacy PF Connection
Third, create the same folder structure, item stats, and permission reports now that the public folders are held on Exchange 2013. Compare them to your reports prior to the migration. Fourth, if satisfied open the Exchange 2013 public folder infrastructure for connections. (commands run from 2013) Remove the serving hierarchy block from your public folder mailboxes. Get-Mailbox PublicFolder Set-Mailbox PublicFolder IsExcludedFromServingHierarchy:$False Double check that it worked Get-Mailbox PublicFolder Where {$_.IsExcludedFromServingHierarchy eq $True} Remove the specific default public folder mailbox from the test user. Get-Mailbox <TestUserID> Set-Mailbox DefaultPublicFolderMailbox $Null
What if we *have* to roll back for some reason? If you need to roll back to legacy public folders, you can perform the following steps on this and the next slide. Be aware that any changes made to the public folders while on Exchange 2013 will not be synchronized back to the legacy public folders. Unlock your legacy public folders. Set-OrganizationConfig PublicFoldersLockedForMigration:$False Mark the migration request on Exchange 2013 as incomplete. Set-OrganizationConfig PublicFolderMigrationComplete:$False
Rollback steps continued Remove all public folder mailboxes from Exchange 2013 Get-Mailbox -PublicFolder Where{$_.IsRootPublicFolderMailbox -eq $false} Remove-Mailbox -PublicFolder -Force -Confirm:$false Get-Mailbox -PublicFolder Remove-Mailbox -PublicFolder -Force -Confirm:$false Note :The Force switch is used above to skip dependency checks like mail enabled folders and public folders residing in the Exchange 2013 public folder mailboxes. This prevents us from having to mail-disable any existing Exchange 2013 public folders prior to the rollback, which would delete the related system objects in the MESO container and remove distribution group memberships and email addresses. With Force used this is no longer a problem and DG memberships and addresses are kept intact. Wait, or close clients and force restarts of MSExchangeIS and MSExchangeRPC.
Legacy public folder databases can be left in place for as long as you want. Once you are ready to remove the DBs because your migration was successful, please use the following resources. Exchange 2007: http://go.microsoft.com/fwlink/?linkid=123678 Exchange 2010: http://go.microsoft.com/fwlink/?linkid=81409
First wave of documentation was released on 5/2/2013! See http://blogs.technet.com/b/exchange/archive/2013/05/02/public-folders-and-exchange-online.aspx for more information and updated documentation URLs. Note: On-premises to on-premises documentation will be refreshed with some refinements probably by 5/9/2013. Second wave of documentation to come will contain the hybrid scenarios.