使用 PowerShell 迁移到 Exchange Online
在本系列的第一部分“使用 PowerShell 将邮箱迁移到 Exchange Online - 第 1 部分”中,我们介绍了如何准备邮箱迁移,其中包括对邮箱移动的一系列预检检查。现在我们继续讨论用于将邮箱从 Exchange Server 移动到 Exchange Online 的 PowerShell 代码。我们将介绍各种移动请求 cmdlet 以及如何使用它们来执行主要迁移任务。上代码吧!
运营
在本节中,我们将快速介绍在管理邮箱迁移到 Exchange Online 时可以使用邮箱执行的各种操作。这些操作将以我们需要运行的 PowerShell cmdlet 的形式出现。
- New-MoveRequest:创建用于将邮箱从 Exchange Server 移动到 Exchange Online 的初始移动请求。
- Suspend-MoveRequest: 挂起活动的迁移并将其置于挂起或暂停状态。
- Set-MoveRequest:更改可配置的移动请求的某些方面。
- Remove-MoveRequest:删除指定的移动请求,所有移动的邮箱数据都将被清除。
- Get-MoveRequest:列出指定的移动请求。
创建新的移动请求
将邮箱移动到 Exchange Online 时,您需要执行一些操作才能创建移动请求。
首先,我们需要邮箱的电子邮件地址,我们将其称为身份。
接下来,我们需要迁移端点,它是一个向本地 Exchange 服务器开放的 HTTPS 连接点,用于 Exchange Online 启动迁移并提取数据。
TargetDomain 是必需的,因为这是您的租户域,通常采用以下格式 。
Exchange Online 需要凭据(在本例中为您的 Active Directory 凭据)来创建连接/迁移连接。
创建移动请求时,我们还可以选择让移动运行完成或在完全同步完成后暂停移动。后一个选项的优点是我们可以为特定邮箱移动事件预先准备邮箱移动。
初始同步后,阶段邮箱移动将每天同步一次,以确保 Exchange Online 中的邮箱副本中存在最新更改。当我们准备完成移动时,唯一要同步的数据是自上次同步以来的更改,这些更改通常很小,并且完成过程更快。我们可以在 New-MoveRequest cmdlet 中使用“SuspendWhenReadyToComplete”开关来实现此目的。
让我们构建一个示例移动请求:
$Mailbox = "< Mailbox PrimarySMTPAddress>"$EndPoint = "mail.domain.com"$TargetDomain = "<tenant>.onmicrosoft.com"$OPCred = Get-Credentials将所有这些变量放在一起,我们得到一个 New-MoveRequest:
New-MoveRequest -Identity $Mailbox -Remote -RemoteHostName $Endpoint -TargetDeliveryDomain $TargetDomain -RemoteCredential $OPCred -SuspendWhenReadyToComplete -ErrorAction STOP使用变量还可以使流程具有可扩展性,可以将批量邮箱分组在 CSV 文件中作为主 SMTP 地址列表。通过使用 Foreach 循环遍历 CSV,我们可以根据需要在 CSV 文件中移动邮箱来运行尽可能多的单行代码。
完成移动请求
暂存移动请求时,以及同步(每日或初始)完成后,邮箱的移动请求将置于挂起状态。如果我们希望完成移动并将邮箱完全转移到 Exchange Online,我们需要恢复移动请求。使用 Resume-MoveRequest cmdlet 是我们可以做到这一点的方法。
恢复请求的一行代码要简单得多,因为在创建移动请求时已经完成了艰苦的工作。简历单行文字如下所示:
Resume-MoveRequest $Mailbox -Confirm:$False唯一需要的标准是我们希望填写的邮箱的主 SMTP 地址。
暂停移动请求
现在,并非所有邮箱迁移都进展顺利。有时,移动请求会占用过多的带宽,实际上可能会影响公司的 WAN 或 Internet 链接,从而影响其他项目或商业利益。那么,如果我们的邮箱搬迁如火如荼地进行,我们该如何减少影响呢?我们有一个名为 Suspend-MoveRequest 的 cmdlet。
挂起请求的一行代码要简单得多,因为在创建移动请求时已经完成了艰苦的工作。暂停一行看起来像这样:
Suspend-MoveRequest $SMTPAddress -Confirm:$False唯一需要的标准是我们希望填写的邮箱的主 SMTP 地址。
删除移动请求
有时,可能需要删除邮箱移动请求。这可能是因为它们是意外创建的,或者用户由于其他依赖关系而不希望被移动,或者我们可能需要取消迁移批次并且需要删除任何相关请求。因此,Microsoft 确实有一个 Remove-MoveRequest cmdlet 来处理这些情况。当我们运行 cmdlet 时,我们将删除移动请求,并且在后端,Microsoft 会删除所有同步数据以便稍后清除。
删除请求的一行代码要简单得多,因为在创建移动请求时已经完成了艰苦的工作。删除一行看起来像这样:
Remove-MoveRequest $SMTPAddress -Confirm:$False唯一需要的标准是我们希望填写的邮箱的主 SMTP 地址。
撤销计划
退出?难道我们不希望所有邮箱都位于 Exchange Online 中,以便我们的最终用户可以使用 Microsoft 创建的所有精彩功能吗?嗯,当然可以,但如果出现严重问题,或者我们没有 Office 365 所需的支持,或者新的 IT 领导者(例如 CIO)决定本地部署是未来的出路,该怎么办……好吧,那么我们需要某种退出计划。对于大多数任务,如果移动请求尚未完成,我们可以简单地停止或暂停移动请求,然后删除该移动请求。在此过程中,我们将邮箱保留在本地,而不是移动到 Exchange Online。但是,如果我们已将邮箱移至 Exchange Online,并且需要将其移回来,该怎么办?
我们需要什么才能将其移回原处?
移回本地 Exchange 需要一些有关 Exchange 服务器的详细信息和知识。我们需要邮箱的 SMTP 地址、将邮箱复制回 Exchange 时用于放置邮箱的邮箱数据库、要连接的端点(与我们用于将邮箱移动到 Exchange Online 的端点相同)、目标域(您的主 SMTP 地址即可)、本地凭据,仅此而已:
$Mailbox = "< Mailbox PrimarySMTPAddress>"$EndPoint = "mail.domain.com"$TargetDomain = "<yourdomain.com>"$Database = "<Database for mailbox>"$OpCred = Get-Credential我们还需要一个出站交换机来确保 Exchange Online 知道该请求正在将邮箱发送出 Exchange Online。
New-MoveRequest -identity $Mailbox -OutBound -RemoteTargetDatabase $Database -RemoteHostName $Endpoint -RemoteCredential $OPCred -TargetDeliveryDomain $TargetDomain对此有一些注意事项,因为有时保留会阻止邮箱移动,您可能需要删除该保留,然后移动邮箱。否则,移回 Exchange Server 的过程与 Exchange Online 相同,其中作业将同步到 95% 并等待启动完成,直到完成为止,每天同步。
将一次性使用转换为批量迁移
虽然一次操作一个邮箱移动有时可能很有用,但最好始终大规模使用 PowerShell。否则,就会失去效率。我们以需要迁移的一批新用户为例。我们了解了如何使用 New-MoveRequest cmdlet 来执行单个任务。为了将其隐藏为批量使用,我们首先需要一个 CSV 文件,我们可以将其导入到 PowerShell 的变量中。一个简单的 CSV 文件如下所示:
PrimarySMTPAddressJohn.Doe@domain.comJane.Doe@domain.com从 Move Request 部分获取变量,添加 Read-Host 单行代码和 Foreach 循环,我们现在有了以下代码:
$Mailbox = "< Mailbox PrimarySMTPAddress>"$EndPoint = "mail.domain.com"$TargetDomain = "<tenant>.onmicrosoft.com"$OPCred = Get-Credentials$CSV = Read-Host -Prompt "Please specify a CSV file for the current wave of users to move to Office 365"$WaveCSV = Import-CSV $CSV
Foreach ($Line in $WaveCSV) {
$Mailbox = $Line.SMTPAddress
New-MoveRequest -Identity $Mailbox -Remote -RemoteHostName $Endpoint -TargetDeliveryDomain $TargetDomain -RemoteCredential $OPCred -SuspendWhenReadyToComplete}该代码需要注意的一点是,没有错误检查或错误收集,这意味着如果移动失败,我们可能需要从屏幕上复制错误代码来确定问题。此外,不提供好的和坏的尝试的日志。因此,此代码是一种将邮箱批量移动/同步到 Exchange Online 的快速方法。同样,此代码框架可用于邮箱迁移的暂停、恢复和删除。只需在 Foreach 循环中插入与正确操作相匹配的一行即可。
报告
将邮箱移动到 Exchange Online 时,监控这些迁移以确保它们以良好的速度移动、不会受到太大限制并及时完成非常重要。我们可以使用 PowerShell 运行报告并创建可用于分析目的的 CSV 格式文件的报告。为此,我们需要几个 cmdlet:Get-MoveRequest 和 Get-MoveRequestStatistics。结合起来,我们可以运行它来查看迁移的进展情况:
Get-MoveRequest | Get-MoveRequestStatistics -ErrorAction STOP | ft DisplayName,Status,PercentComplete通过这一行,我们将了解所有移动的进度,显示邮箱名称、其迁移状态以及到目前为止移动已完成的百分比。同样的单行代码也可以被推送以将统计信息输出到 CSV 文件:
$CSV = Read-Host -Prompt "Please specify a CSV file for the current wave of users to move to Office 365"$Row = "DisplayName,Status,PercentComplete" = Out-File $DestinationFileForeach ($Line in $CSV) {$Move = Get-MoveRequestStatistics -Identity $Mailbox | Select DisplayName,Status,PercentComplete$DisplayName = $Move.DisplayName$Status = $Move.Status$PercentComplete = $Move.PercentComplete$Row = "$DisplayName,$Status,$PercentComplete"$Row = Out-File $DestinationFile -Append}CSV 注意事项
要记住的一件事是,当通过 CSV 处理任何移动请求时,CSV 文件不是硬性限制。仅仅因为移动是使用一个 CSV 文件创建的,并不意味着移动请求不能由另一个文件暂停、删除、恢复或报告。换句话说,如果创建时 CSV 文件中有 25 个名称,我们可以创建一个全新的 CSV 文件,其中包含 15 个名称甚至 50 个名称来管理。每个移动请求彼此完全独立。因此,请根据需要进行调整,因为您会的。
结论
在有关将邮箱迁移到 Exchange Online 的这一系列文章中,我们探讨了各种先决条件以及均可通过 PowerShell 执行的邮箱移动操作。
我们研究了可能的障碍,例如无效的 SMTP 域以及邮箱移动到 Exchange Online 时需要注意的策略。在移动请求方面,我们研究了创建、暂停、恢复、完成甚至恢复到本地 Exchange Server。
应该清楚的是,一个全面的脚本需要涵盖很多内容,但在 PowerShell 中这一切都是可行的。我们甚至可以进一步自定义编码,包括详细的脚本日志记录(可能是未来的博客文章?)、自定义邮箱移动的报告等。 PowerShell 提供了一个用于处理批量任务的出色工具,并节省了我们在 GUI 中创建所有这些移动的时间。
