Move Public Folder script from 2007/2010 to Office 365 Script created by Ward Vissers

 www.wardvissers.nl

 

 THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK

 OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER

 

 

 Please Select the Choice You Want

 

 Prepare for Migration (Legacy Exchange Server

 00) Add the Office 365 Domain Name

 01) Take a snapshot of the original source folder structure

 02) Take a snapshot of public folder statistics such as item count, size, and owner.

 03) Take a snapshot of the permissions

 04) Locate public folders that have a backslash in the name

 05) Rename Public Folder

 06) Checks the public folder migration status.

 07) Set PublicFolderMigrationComplete to False

 

 Check Office 365

 08) Get-PublicFolderMigrationRequest

 09) Get-Mailbox -PublicFolder

 10) Get-PublicFolder

 

 Generate CSV Files and create Public Folder Mailboxes (Legacy Exchange Server)

 11) Export-PublicFolderStatistics PFSizeMap.csv

 12) PublicFolderToMailboxMapGenerator PFMailboxMap.csv

 

 Create the public folder mailboxes on Exchange Online

 13) Master Public Folder Name

 14) Create Public Folder Mailboxen (Check PFMailboxMap.csv)

 

 Migrating the Public Folders

 15) Export mail-enabled public folders from Active Directory

 16) LegacyExchangeDN Administrator

 17) LegacyExchangeDN Public Folder Server

 18) External Name Outlook Anywhere

 19) Set the XML file

 20) Give the CSV file to start the Migration

 21) Public Folder Migration Status

 

 Lock down the public folders on the legacy Exchange server for final migration (downtime required)

 22) Lock the legacy public folders for finalization

 

 Finalize the public folder migration (downtime required)

 23) Finalize the public folder migration (downtime required)

 

 Test and unlock the public folder migration

 24) Add Public Folder to Test User

 25) Unlock the public folders for all other users

 26) Public Folder Migration Complete (Legacy Exchange Server)

 27) Public Folders Enabled Local

 

 Final Check

 28) Take a snapshot of the original source folder structure.

 29) Take a snapshot of the public folder statistics such as item count, size, and owner

 30) Take a snapshot of the permissions

 

 99) Exit

 

PowerShell
Edit|Remove
# V1.0 Begin 
 
"*************************************************************************************" 
" Move Public Folder script from 2007/2010 to Office 365 Script created by Ward Vissers" 
" www.wardvissers.nl" 
"" 
" THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK" 
" OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER " 
"" 
""                                           
" Please Select the Choice You Want" 
"" 
" Prepare for Migration (Legacy Exchange Server" 
" 00) Add the Office 365 Domain Name" 
" 01) Take a snapshot of the original source folder structure" 
" 02) Take a snapshot of public folder statistics such as item count, size, and owner." 
" 03) Take a snapshot of the permissions" 
" 04) Locate public folders that have a backslash in the name"  
" 05) Rename Public Folder" 
" 06) Checks the public folder migration status." 
" 07) Set PublicFolderMigrationComplete to False" 
"" 
" Check Office 365" 
" 08) Get-PublicFolderMigrationRequest" 
" 09) Get-Mailbox -PublicFolder" 
" 10) Get-PublicFolder" 
"" 
" Generate CSV Files and create Public Folder Mailboxes (Legacy Exchange Server)" 
" 11) Export-PublicFolderStatistics PFSizeMap.csv" 
" 12) PublicFolderToMailboxMapGenerator PFMailboxMap.csv" 
"" 
" Create the public folder mailboxes on Exchange Online" 
" 13) Master Public Folder Name" 
" 14) Create Public Folder Mailboxen (Check PFMailboxMap.csv)" 
"" 
" Migrating the Public Folders" 
" 15) Export mail-enabled public folders from Active Directory" 
" 16) LegacyExchangeDN Administrator" 
" 17) LegacyExchangeDN Public Folder Server" 
" 18) External Name Outlook Anywhere" 
" 19) Set the XML file" 
" 20) Give the CSV file to start the Migration" 
" 21) Public Folder Migration Status"  
"" 
" Lock down the public folders on the legacy Exchange server for final migration (downtime required)"  
" 22) Lock the legacy public folders for finalization" 
"" 
" Finalize the public folder migration (downtime required)" 
" 23) Finalize the public folder migration (downtime required)"  
"" 
" Test and unlock the public folder migration" 
" 24) Add Public Folder to Test User" 
" 25) Unlock the public folders for all other users" 
" 26) Public Folder Migration Complete (Legacy Exchange Server)" 
" 27) Public Folders Enabled Local" 
"" 
" Final Check" 
" 28) Take a snapshot of the original source folder structure." 
" 29) Take a snapshot of the public folder statistics such as item count, size, and owner"  
" 30) Take a snapshot of the permissions" 
"" 
" 99) Exit"                                                          
""                                                             
"*******************************************************************************************************" 
$a=read-host 
IF ($a-eq 0) 
{ 
$domainname = Read-Host 'What is the Office 365 Domain Name' 
New-AcceptedDomain -Name "PublicFolderDestination_78c0b207_5ad2_4fee_8cb9_f373175b3f99" -DomainName $domainname -DomainType InternalRelay  
} 
IF ($a-eq 1) 
{ 
# take a snapshot of the original source folder structure 
Get-PublicFolder -Recurse | Export-CliXML C:\PFMigration\Legacy_PFStructure.xml 
} 
ElseIf ($a-eq 2) 
{ 
# take a snapshot of public folder statistics such as item count, size, and owner. 
Get-PublicFolderStatistics | Export-CliXML C:\PFMigration\Legacy_PFStatistics.xml 
} 
ElseIf ($a-eq 3)   
{ 
# take a snapshot of the permissions 
Get-PublicFolder -Recurse | Get-PublicFolderClientPermission | Select-Object Identity,User -ExpandProperty AccessRights | Export-CliXML C:\PFMigration\Legacy_PFPerms.xml 
} 
ElseIf ($a-eq 4)  
{ 
$versie = Read-Host 'What is the Legacy Exchange Versie 2007 or 2010' 
 IF ($versie-eq 2010) 
 { 
 # Locate public folders that have a backslash in the name Exchange 2010 
 Get-PublicFolderStatistics -ResultSize Unlimited | Where {$_.Name -like "*\*"| Format-List Name, Identity 
 } 
 IF ($versie-eq 2007) 
 { 
 # Locate public folders that have a backslash in the name Exchange 2007 
 Get-PublicFolderDatabase | ForEach {Get-PublicFolderStatistics -Server $_.Server | Where {$_.Name -like "*\*"}} 
 } 
} 
ElseIf ($a-eq 5)  
{ 
# rename public folder 
$publicold = Read-Host 'What is the Public Folder Name' 
$publicnew = Read-Host 'What is the new Public Folder Name' 
Set-PublicFolder -Identity $publicold -Name $publicnew 
} 
ElseIf ($a-eq 6)  
{ 
# Checks the public folder migration status 
Get-OrganizationConfig | Format-List PublicFoldersLockedforMigration, PublicFolderMigrationComplete 
} 
ElseIf ($a-eq 7)   
{ 
#If the status of the PublicFoldersLockedforMigration or PublicFolderMigrationComplete properties is $true, run the following command to set the value to $false. 
Set-OrganizationConfig -PublicFoldersLockedforMigration:$false -PublicFolderMigrationComplete:$false  
} 
ElseIf ($a-eq 8)  
{ 
Get-PublicFolderMigrationRequest 
} 
ElseIf ($a-eq 9)  
{ 
Get-Mailbox -PublicFolder 
} 
ElseIf ($a-eq 10)  
{ 
Get-PublicFolder 
} 
ElseIf ($a-eq 11)  
{ 
# 
$servername = Read-Host 'What is the Legacy Public Folder Exchange Server?' 
.\Export-PublicFolderStatistics.ps1 C:\PFMigration\PFSizeMap.csv $servername 
} 
ElseIf ($a-eq 12)  
{ 
# PublicFolderToMailboxMapGenerator PFMailboxMap 
.\PublicFolderToMailboxMapGenerator.ps1 10GB C:\PFMigration\PFSizeMap.csv C:\PFMigration\PFMailboxMap.csv 
} 
ElseIf ($a-eq 13)  
{ 
# Master Public Folder Name 
$publicmaster = Read-Host 'What is the Master Public Folder Name?' 
New-Mailbox -PublicFolder $publicmaster -HoldForMigration:$true 
} 
ElseIf ($a-eq 14)  
{ 
 
$numberOfMailboxes = Read-Host 'What is the number of Mailboxen?' 
for($index =1 ; $index -le $numberOfMailboxes ; $index++) 
 { 
    $PFMailboxName = "Mailbox"+$index;  if($index -eq 1) {New-Mailbox -PublicFolder $PFMailboxName -HoldForMigration:$true -IsExcludedFromServingHierarchy:$true;}else{New-Mailbox -PublicFolder $PFMailboxName -IsExcludedFromServingHierarchy:$true} 
 } 
} 
ElseIf ($a-eq 15) 
{ 
# 
$xml = Read-Host 'What is name for the XML File ?' 
.\Export-MailPublicFoldersForMigration.ps1 $xml 
} 
ElseIf ($a-eq 16) 
{ 
 
$administrator = Read-Host 'What is the Public folder Administrator?' 
Get-Mailbox $administrator | Select-Object LegacyExchangeDN 
} 
ElseIf ($a-eq 17)  
{ 
# 
$servername = Read-Host 'What is the Legacy Public Folder Exchange Server?' 
Get-ExchangeServer $servername | Select-Object -Expand ExchangeLegacyDN 
} 
ElseIf ($a-eq 18) 
{ 
 
Get-OutlookAnywhere | Format-Table Identity,ExternalHostName 
} 
ElseIf ($a-eq 19) 
{ 
 
$xml = Read-Host 'What is name for the XML File ?' 
.\Import-MailPublicFoldersForMigration.ps1 $xml 
} 
ElseIf ($a-eq 20) 
{ 
# 
$administrator = Read-Host 'What is the Public folder Administrator?' 
$domain = Read-Host 'What is the local domain?' 
$source_credential = Get-Credential $domain\$administrator 
$dnadministrator = Read-Host 'What is the LegacyDN from the Public folder Administrator?' 
$source_remoteMailboxLegacyDN = $dnadministrator 
$dnserver = Read-Host 'What is the LegacyDN from the Public folder Server?' 
$source_remotePublicFolderServerLegacyFQDN = $dnserver 
$outlookanywhere = Read-Host 'What is the Outlook Anywhere Name?' 
$source_OutlookAnywhereExternalHostName = $outlookanywher 
$csv = Read-Host 'What is name for the CSV File ?' 
New-PublicFolderMigrationRequest -OutlookAnywhereHostName: $source_OutlookAnywhereExternalHostName -CSVData (Get-Content $csv -Encoding Byte) -RemoteCredential: $source_credential -RemoteMailboxLegacyDN: $source_remoteMailboxLegacyDN -RemoteMailboxServerLegacyDN: $source_remotePublicFolderServerLegacyFQDN -AuthenticationMethod Basic 
} 
ElseIf ($a-eq 21) 
{ 
# 
Get-PublicFolderMigrationRequest | Get-PublicFolderMigrationRequestStatistics -IncludeReport | Format-List 
} 
ElseIf ($a-eq 22) 
{ 
# Lock the legacy public folders for finalization 
Set-OrganizationConfig -PublicFoldersLockedForMigration:$true 
} 
ElseIf ($a-eq 23) 
{ 
#  Finalize the public folder migration (downtime required) 
Set-PublicFolderMigrationRequest -Identity \PublicFolderMigration -PreventCompletion:$false 
Resume-PublicFolderMigrationRequest -Identity \PublicFolderMigration 
} 
ElseIf ($a-eq 24) 
{ 
# Test User to Public Folder 
$usernameRead-Host 'What is the User name?' 
$publicfoldermailboxRead-Host 'What is the Public Folder Mailbox Name?' 
Set-Mailbox -Identity $username -DefaultPublicFolderMailbox $publicfoldermailbox 
} 
ElseIf ($a-eq 25) 
{ 
# unlock the public folders for all other users. 
Get-Mailbox -PublicFolder | Set-Mailbox -PublicFolder -IsExcludedFromServingHierarchy $false 
} 
ElseIf ($a-eq 26) 
{ 
# PublicFolderMigrationComplete 
Set-OrganizationConfig -PublicFolderMigrationComplete:$true 
} 
ElseIf ($a-eq 27) 
{ 
# Set-OrganizationConfig -PublicFoldersEnabled Local 
Set-OrganizationConfig -PublicFoldersEnabled Local 
} 
ElseIf ($a-eq 28) 
{ 
 
Get-PublicFolder -Recurse | Export-CliXML  C:\PFMigration\Cloud_PFStructure.xml 
} 
ElseIf ($a-eq 29) 
{ 
# 
Get-PublicFolderStatistics -ResultSize Unlimited | Export-CliXML  C:\PFMigration\Cloud_PFStatistics.xml 
} 
ElseIf ($a-eq 30) 
{ 
 
Get-PublicFolder -Recurse | Get-PublicFolderClientPermission | Select-Object Identity,User -ExpandProperty AccessRights | Export-CliXML  C:\PFMigration\Cloud_PFPerms.xml 
} 
ElseIf ($a-eq 99) 
{exit