如何将邮箱从一个 Microsoft 365 或 Office 365 组织中迁移到另一个

注意

目前,我们已在以下位置中推出了本地交叉租户邮箱迁移的公共预览版: https://aka.ms/CrossTenantMailboxMigration

本文介绍如何在业务合并方案中将邮箱和服务设置从一个 Microsoft 365 或Office 365组织迁移到另一个 Microsoft 365 或Office 365组织。 如果有 500 多个要迁移的用户或要迁移的大量 SharePoint 数据,最好与 Microsoft 解决方案提供商合作。

本文中的方案基于两个虚构公司(Contoso.com 和 Fabrikam.com)使用两个单独的Office 365组织。 Contoso 已购买 Fabrikam,并将 Fabrikam 用户和数据移动到 contoso.com Office 365组织。

租户 1(目标) 租户 2(源)
自定义电子邮件域: contoso.com fabrikam.com
Office 365 初始域: contoso.onmicrosoft.com fabrikam.onmicrosoft.com

方案:使用第三方迁移工具进行迁移

此方案假定 Fabrikam 公司的用户、组和其他对象将在 Office 365中手动创建,通过脚本导入门户,或通过Active Directory 域服务 (AD DS) 合并合并到 Contoso Active Directory 中。

完成后,所有 Fabrikam 帐户将存在于 Contoso.com Office 365 组织中,并且将全部用于 @fabrikam.com UPN。 为确保简单和简洁,选择了这种最终寻址方案,当然,你也可以根据需要进行修改。

如何将邮箱数据从一个 Microsoft 365 或 Office 365 组织移动到另一个。

规划:迁移前两周

如果使用第三方迁移工具来迁移用户,请购买迁移所需的许可证。

客户端注意事项

对于 Outlook 2010 或更高版本,仅需要删除 Outlook 用户配置文件重新创建它即可。

对于 Outlook 2007 和 Outlook 2010,当你重启客户端时,自动发现将配置客户端并重新生成 。OST 文件。

对于Skype for Business客户端,迁移完成后,由于该过程会创建新的配置文件,因此需要添加联系人

租户准备和许可

源租户是要从中迁移用户和数据的 Fabrikam Office 365 组织。 目标租户是要迁移到的 Contoso Office 365 组织。

  1. 在目标 Office 365 组织中增加许可证,以适应将从源租户中迁移的所有邮箱。

  2. 在源租户和目标租户中创建管理员帐户,以便在从一个 Office 365 迁移到另一个 Office 365 时使用。 某些迁移工具可能要求源租户具有多个管理员帐户,以优化数据吞吐量。

目标租户中的会议室、资源、通讯组和用户对象创建

在目标 (Contoso) 租户中创建资源:

  1. 若要使用 Azure AD Connect 工具同步 Contoso Active Directory 域服务 (AD DS) 的所有对象,则必须通过合并在目标 (Contoso) 租户中创建源 (Fabrikam) 租户 AD DS 中的对象。

    1. 可使用各种 AD DS 工具完成 AD DS 合并。 根据要迁移的对象多少,可能需要花额外的时间来规划合并,以便在迁移项目之前完成。

    2. 验证所有新用户和组均已通过目录同步同步到 Contoso.com 目标租户。 对象应显示为新租户中, user@contoso.onmicrosoft.com 因为 Fabrikam 域目前尚未移动。 域移动完成后,可将用户和组的主电子邮件地址更新为 @fabrikam.com 。

  2. 如果不使用目录同步,或者源租户的Microsoft 365 管理中心中管理任何会议室、资源、组或用户,则必须在目标租户中创建这些对象。 可在 Microsoft 365 管理中心手动创建对象,如果对象数目较大,则可使用 Microsoft 365 管理中心的批量添加功能或使用 Windows PowerShell 导入 CSV 文件。

最终用户通信

向组织中的最终用户传达迁移:

  1. 制定通信计划,并开始通知用户即将进行的迁移和服务更改。

  2. 迁移后,必须清除所有 Outlook 客户端上的自动完成列表(也称为昵称缓存)。 若要稍后在 Outlook 2010 中删除自动完成列表内的所有收件人,请参阅使用“自动完成”管理“收件人”、“抄送”和“密件抄送”框中的建议收件人

  3. 让用户了解如何使用新登录信息连接到以前称为 Outlook Web App) 的Outlook 网页版 (,以防他们在迁移后出现问题。

准备和迁移前活动:迁移前三天

域准备

若要为迁移准备域,请完成以下步骤。

  1. 在 Fabrikam.com 电子邮件域的目标 (Contoso) 租户上开始域验证过程。

  2. 在 contoso.com Microsoft 365 管理中心,添加 Fabrikam.com 域,并在域名系统 (DNS) 中创建 TXT 记录以供验证。

    注意

    由于其他租户中仍在使用此域,验证将失败。

    执行此步骤现在允许传播 DNS 记录时间,因为它可能需要长达 72 小时。 最终验证将在此过程的后面进行。

迁移安排

若要安排迁移,请执行以下操作:

  1. 创建要迁移的用户邮箱的主列表。

  2. 为正在使用的第三方迁移工具创建邮箱映射 .CSV 文件。 迁移工具将使用此映射文件,以在发生迁移时将源邮箱与目标租户邮箱相匹配。 建议使用 *.onmicrosoft.com“初始”域来映射源帐户,因为自定义电子邮件域会不断更改

用于将邮箱数据从一个 Office 365 组织迁移到另一个租户的 CSV 文件。

邮件交换器记录(MX 记录)生存时间 (TTL) 测试

接下来,将制定 TTL 测试计划。

  1. 在 DNS 中,将要迁移的主要电子邮件域的 MX 记录的 TTL 值更改为较小的数字(如,5 分钟)。 如果 TTL 不能降低到 5 分钟,请记下最小值。 例如,如果最小值为 4 小时,则必须在迁移开始前 4 小时更改 MX 记录。

  2. MX 查阅验证 MX 和 DNS 更改。

禁用源租户中的目录同步

在源租户 Microsoft 365 管理中心,禁用目录同步。此过程可能需要 24 小时或更长时间,因此必须在迁移之前完成。 在门户中禁用后,对源租户 AD DS 所做的更改将不再同步到 Office 365 组织。 相应地调整现有用户和组预配过程。

迁移:迁移当天

以下是迁移当天需要执行的步骤。

MX 记录更改 – 阻止入站邮件流

将主要 MX 记录从Office 365更改为无法访问的域,即“unreachable.example.com”。 尝试传送新邮件的 Internet 邮件服务器会对邮件进行列队,并在 24 小时内尝试重新传送。 使用此方法,某些电子邮件可能会返回未送达报告 (NDR),具体取决于尝试传送电子邮件的服务器。 如果这为你带来困扰,请使用 MX 记录备份服务。 有许多第三方服务会将电子邮件排队数天或数周。 迁移完成后,这些服务会将排队的邮件传递到新的Office 365组织。

提示

如果 TTL 较短(例如,5 分钟),则可以在工作日结束时执行此步骤,以减少中断。 如果 TTL 较长,则必须在距离 TTL 到期的时间之前更改 MX 记录。 例如,如果计划在晚上 6 点开始迁移,则必须在下午 2 点前更改值为 4 小时的 TTL。

根据需要验证 MX 和 DNS 更改。 可使用 Nslookup 或 MxToolbox 之类的服务来验证 MX 和 DNS 更改。

源租户准备

必须删除源租户中所有对象的主要电子邮件域 fabrikam.com,然后才能将该域迁移到目标租户。

  1. 如果还使用 SharePoint Online 公共网站中设置了域,则必须先将该网站的 URL 设置回初始域,然后才能删除该域。

  2. 使用 Lync 管理门户删除源租户中用户的所有 Lync 许可证。 这会删除连接到 Fabrikam.com 的 Lync Sip 地址。

  3. 将 Office 365 源邮箱中的默认电子邮件地址重置为初始域 (fabrikam.onmicrosoft.com)。

  4. 将所有分发Lists、会议室和资源的默认电子邮件地址重置为源租户中的初始域 (fabrikam.onmicrosoft.com) 。

  5. 从仍在使用 @fabrikam.com的用户对象中删除所有辅助电子邮件 (代理地址) 。

  6. 将源租户中的默认域设置为 fabrikam.onmicrosoft.com 路由域(在管理门户中,单击右上角的公司名称)。

  7. 使用 Windows PowerShell 命令 Get-MsolUser -DomainName Fabrikam.com 检索仍在使用该域并阻止删除的所有对象的列表。

  8. 有关常见域删除问题,请参阅 You get an error message when you try to remove a domain from Office 365(尝试从 Office 365 中删除域时收到错误消息)。

目标租户准备

在 contoso.com 租户中完成 Fabrikam.com 域的验证。 从旧租户中删除域后,可能需要等待一小时。

  1. 配置自动发现 CNAME(内部/外部)(可选)。

  2. 如果使用 AD FS,请在 AD FS 的目标租户中配置新域。

  3. Begin mailbox activation in the contoso.com tenant > Assign licenses to all of the new user accounts.

  4. 将 Fabrikam.com 电子邮件域设置为新用户的主要地址。 可通过在门户中选择/编辑多个未授权用户或使用 Windows PowerShell 完成此操作。

  5. 如果未使用密码哈希同步功能、直通身份验证或 AD FS,请在目标 (Contoso) 租户中的所有邮箱上设置密码。 如果未使用通用密码,请通知用户新密码。

  6. 授权并激活邮箱后,转换邮件路由。 将 Fabrikam MX 记录指向 Office 365 目标 (Contoso) 租户。 MX TTL 过期后,邮件开始流入新的空邮箱。 如果使用 MX 备份服务,则可以将电子邮件发布到新邮箱。

  7. 在目标租户中对流入和流出新邮箱的邮件进行验证测试。

  8. 如果使用 Exchange Online Protection (EOP) :在目标租户中,从源租户重新创建邮件流规则 (也称为传输规则) 、连接器、阻止列表、允许列表等。

开始迁移

若要尽可能减少停机时间和给用户带来的不便,请确定迁移的最佳方法。

  • 500 位或以下用户的迁移:将邮件日历和联系人数据迁移到目标租户邮箱。 如果可能,按日期限制邮件迁移,例如,最近 6 个月的数据。

  • 迁移超过 500 个用户:使用多传递方法,迁移联系人、日历和所有用户仅 1 周的电子邮件,然后在后续几天或几周内执行多个传递,以使用较旧的电子邮件数据填充邮箱。

通过第三方迁移工具开始邮件迁移。

  1. 使用供应商提供的工具监视迁移进度。 迁移过程中,定期向管理和迁移团队发送进度报告。

  2. 完成所有迁移后,执行第二遍和第三遍迁移(可选)。

迁移结束时,Outlook 2007 和 Outlook 2010 会同步每个用户的整个邮箱,这会占用大量带宽,具体取决于要迁移到每个邮箱中的数据多少。 Outlook 2013 默认仅缓存 12 个月的数据。 此设置可配置为更多或更少的数据(例如,仅 3 个月的数据),以减少带宽使用。

迁移后:清除

回复已迁移电子邮件时,用户可能会收到 NDR。 需要清除 Outlook 自动完成列表(也称为 昵称缓存)。 若要稍后在 Outlook 2010 中删除自动完成列表内的所有收件人,请参阅使用“自动完成”管理“收件人”、“抄送”和“密件抄送”框中的建议收件人。 或者,将旧的 DN 作为 x.500 代理地址添加到所有用户。

Windows PowerShell 脚本示例

使用以下 Windows PowerShell 脚本示例开始创建自己的脚本。

Office 365 批量密码重置

  1. 创建名为 password.csv 的 CSV 文件。

  2. 在此文件中插入“upn”和“newpassword”列 (示例: johnsmith@contoso.com、Password1)

  3. 使用 Windows PowerShell 命令:

    Import-Csv password.csv|%{Set-MsolUserPassword -userPrincipalName $_.upn -NewPassword $_.newpassword -ForceChangePassword $false}
    

将包含特定代理地址的所有 Office 365 帐户复制到 CSV 文件中

##########################################################################
# Script: showproxies.ps1
# Copies all accounts in Microsoft 365 that contain/don't contain a specific
# proxyaddress to a .CSV file (addresses.csv)
#
# Change the following variable to the proxy address string you want to find:
# $proxyaddr = "onmicrosoft.com"
################################################################################
$proxyaddr = "onmicrosoft.com"
# Create an object to hold the results
$addresses = @()
# Get every mailbox in the Exchange Organization
$Mailboxes = Get-Mailbox -ResultSize Unlimited
# Loop through the mailboxes
ForEach ($mbx in $Mailboxes) {
    # Loop through every address assigned to the mailbox
    Foreach ($address in $mbx.EmailAddresses) {
       # If it contains XXX,  Record it
        if ($address.ToString().ToLower().contains($proxyaddr)) {
            # This is an email address. Add it to the list
            $obj = "" | Select-Object Alias,EmailAddress
            $obj.Alias = $mbx.Alias
            $obj.EmailAddress = $address.ToString() #.SubString(10)
            $addresses += $obj
      }
    }
}
# Export the final object to a csv in the working directory

$addresses | Export-Csv addresses.csv -NoTypeInformation
# Open the csv with the default handler
Invoke-Item addresses.csv

##### END OF SHOWPROXIES.PS1

在 Microsoft 365 中批量创建会议室邮箱

注意

  • 在运行以下脚本之前,需要安装 Exchange Online PowerShell 模块。 有关说明,请参阅安装和维护 Exchange Online PowerShell 模块。 该模块使用新式身份验证。

  • 通常情况下,如果组织是 Microsoft 365 或 Microsoft 365 GCC,则可按原样使用该脚本。 如果组织是 Office 365 德国、Microsoft 365 GCC 高或 Microsoft 365 DoD,则需编辑脚本中的 Connect-ExchangeOnline 行。 具体来说,你需要为组织类型使用 ExchangeEnvironmentName 参数和适当的值。 有关更多信息,请参阅连接到 Exchange Online PowerShell中的示例。

################################################################################
# Script: create-rooms.ps1
# Description:*** RUN THIS SCRIPT FROM A WINDOWS POWERSHELL SESSION ***
# This script creates room mailboxes in Microsoft 365.
# Syntax:Create-Rooms.ps1 -InputFile "file name.csv"
#
# Dependencies: Input file should contain 3 columns: RoomName, RoomSMTPAddress, RoomCapacity
#
################################################################################
param( $inputFile )
Function Usage
{
$strScriptFileName = ($MyInvocation.ScriptName).substring(($MyInvocation.ScriptName).lastindexofany("\") + 1).ToString()
@"
NAME:
$strScriptFileName
EXAMPLE:
C:\PS> .\$strScriptFileName -InputFile `"file name.csv`"
"@
}
If (-not $InputFile) {Usage;Exit}

If ($ExchRemoteCmdlets.State -ne "Opened")
{
Write-Host
Write-Host Connecting to Exchange Online PowerShell...
Write-Host
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline
$Global:ExchRemoteCmdlets = Get-PSSession -Name ExchangeOnlineInternalSession*
}
# Import the CSV file in Exchange Online
$csv = Import-CSV $inputfile
# Create Rooms contained in the CSV file in Exchange Online
$csv | foreach-object{
New-Mailbox -Name $_.RoomName -Room -PrimarySmtpAddress $_.RoomSMTPAddress -ResourceCapacity $_.RoomCapacity
}
##### END OF CREATE-ROOMS.PS1

从邮箱中批量删除辅助电子邮件地址

注意

  • 在运行以下脚本之前,需要安装 Exchange Online PowerShell 模块。 有关说明,请参阅安装和维护 Exchange Online PowerShell 模块。 该模块使用新式身份验证。

  • 通常情况下,如果组织是 Microsoft 365 或 Microsoft 365 GCC,则可按原样使用该脚本。 如果组织是 Office 365 德国、Microsoft 365 GCC 高或 Microsoft 365 DoD,则需编辑脚本中的 Connect-ExchangeOnline 行。 具体来说,你需要为组织类型使用 ExchangeEnvironmentName 参数和适当的值。 有关更多信息,请参阅连接到 Exchange Online PowerShell中的示例。

##########################################################################
#      Script:  remove-proxy.ps1
# Description:*** RUN THIS SCRIPT FROM A WINDOWS POWERSHELL SESSION ***
# This script will remove a secondary email address from many users
#
# Syntax:remove-proxy.ps1 -InputFile "filename.csv"
#
# Dependencies:Input file should contain 2 columns: Username, Emailsuffix
#               Example:  Username=tim, Emailsuffix=fabrikam.com
# Script will remove the address tim@fabrikam.com from the mailbox for Tim.
# NOTE: Address must be secondary; it will not remove primary email address.
#
################################################################################
param( $inputFile )
Function Usage
{
$strScriptFileName = ($MyInvocation.ScriptName).substring(($MyInvocation.ScriptName).lastindexofany
("\") + 1).ToString()
@"
NAME:
$strScriptFileName
EXAMPLE:
C:\PS> .\$strScriptFileName -inputfile `"file name.csv`"
"@
}
If (-not $inputFile) {Usage;Exit}

If ($ExchRemoteCmdlets.State -ne "Opened")
{
Write-Host
Write-Host Connecting to Exchange Online PowerShell...
Write-Host
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline
$Global:ExchRemoteCmdlets = Get-PSSession -Name ExchangeOnlineInternalSession*
}
# Import the CSV file and change primary smtp address in Exchange Online
$csv = Import-CSV $inputfile
$csv | foreach-object{
# Set variable for email address to remove in Exchange Online
$removeaddr = $_.username + "@" + $_.emailsuffix
Write-Host ("Processing User: " + $_.UserName +" - Removing " + $removeaddr)
Set-Mailbox $_.Username -EmailAddresses @{Remove=$removeaddr}
}
##### END OF REMOVE-PROXY.PS1