当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell - 批量模式添加电子邮件地址 |办公室 365 |第 4 部分#13

作者:精品下载站 日期:2024-12-14 09:05:55 浏览:16 分类:玩电脑

使用 PowerShell - 批量模式添加电子邮件地址 |办公室 365 |第 4 部分#13


当前文章是上一篇文章的论点,其中我们回顾了使用 PowerShell 向 Exchange Online 收件人添加电子邮件地址的任务。本文的重点是如何执行批量模式添加附加电子邮件地址的任务。

使用批量模式添加电子邮件地址

“批量操作”的显着优点是,通过“单击”,我们可以同时更新许多“对象”,例如 Exchange Online 收件人,而无需单独处理每个收件人。

同时,这种“显着优势”也很容易变成“显着劣势”。

如果“批量操作”在我们的生产环境中运行之前没有经过测试和验证,一旦PowerShell批量命令执行不当,可能会对我们的组织环境造成相当大的损害!

[玩转系统] 使用 PowerShell - 批量模式添加电子邮件地址 |办公室 365 |第 4 部分#13

问题是,当我们使用“重型工具”(例如批量操作)时,建议我们准确了解 PowerShell Bulk 命令“做什么”。

我的建议是,执行批量操作之前,尝试在“实验室”环境中测试“批量操作”,或者用于在“测试用户”上实现批量操作。

在我们确定 PowerShell 批量命令正确执行操作并运行所需的批量命令后,重要的是我们将通过检查受影响的“对象”(例如Exchange Online 邮箱)并且配置正确。

有用的工具 - Whatif

我们在使用“批量命令”时可以使用的一个非常有用且强大的 PowerShell 选项是选项(参数) - Whatif

使用 Whatif 选项,使我们能够模拟运行“批量 PowerShell 命令”时“会发生什么”的场景,而无需对环境进行任何更改。

我的建议是,在“点击”执行批量 PowerShell 命令的按键之前,尽可能多地使用 Whatif 选项,这可能会影响数百个甚至数千个邮箱同一时间。

在以下示例中,我们运行“批量命令”,通过向每个 Exchange 收件人添加额外的电子邮件地址来“影响”所有现有的 Exchange Online 邮箱。

为了能够“预测”批量 PowerShell 命令“将执行的操作”,我们添加了 Whatif PowerShell 参数。

在我们的示例中,我们可以看到“批量操作”将在特定 Exchange 邮箱上成功运行,例如“Angelina”、“Aretha”和“Beyonce” ”。

同时,我们可以看到批量操作无法更新某些 Exchange 收件人。

查看 Whatif 结果,我们可以看到批量操作无法更新特定的 Exchange 邮箱,例如 Adele 邮箱。

PS C:\> $AllMailboxes = Get-Mailbox -ResultSize Unlimited
Foreach ($Mailbox in $AllMailboxes)
{
$NewAddress = $Mailbox. UserPrincipalName + "@o365pilot.com" # Create a new string that add a NEW E-mail address with the NEW domain suffix
$Mailbox.UserPrincipalName += $NewAddress # “Collect” all existing E-mail addresses + add the NEW E-mail address as an additional E-mail address (existing E-mail address will not be removed).
Set-Mailbox -Identity $Mailbox.Alias -EmailAddresses $Mailbox.EmailAddresses -whatif
}
The operation on mailbox "Adele" failed because it's out of the current user's write scope. The action 'Set-Mailbox', 'EmailAddresses', can't be performed on the object 'Adele' because the object is being
synchronized from your on-premises organization. This action should be performed on the object in your on-premises organization.

+ CategoryInfo : InvalidOperation: (Adele:ADObjectId) [Set-Mailbox], InvalidOperationException

+ FullyQualifiedErrorId : [Server=DB6PR0501MB2069,RequestId=25c4f399-2412-41c2-9a77-41af5911613e,TimeStamp=1/9/2017 11:43:30 AM] [FailureCategory=Cmdlet-InvalidOperationException] 4728449,Microsoft.Ex
change.Management.RecipientTasks.SetMailbox

+ PSComputerName : outlook.office365.com
The operation couldn't be performed because 'Alicia Keys' matches multiple entries.

+ CategoryInfo : NotSpecified: (:) [Set-Mailbox], ManagementObjectAmbiguousException

+ FullyQualifiedErrorId : [Server=DB6PR0501MB2069,RequestId=25c4f399-2412-41c2-9a77-41af5911613e,TimeStamp=1/9/2017 11:43:31 AM] [FailureCategory=Cmdlet-ManagementObjectAmbiguousException] 6E7A870C,Mi
crosoft.Exchange.Management.RecipientTasks.SetMailbox

+ PSComputerName : outlook.office365.com

What if: Setting mailbox "Angelina".
What if: Setting mailbox "Aretha".
What if: Setting mailbox "Beatles".
What if: Setting mailbox "Beyonce".

在我们的特定场景中,PowerShell 命令无法更新 Adele 的邮箱,因为 Adele 用户帐户被视为从 On-Premise Active 同步到 Exchange Online 基础结构的“同步用户帐户”目录。

在这种类型的场景中,我们需要在本地环境(本地 Active Directory 或本地 Exchange)而不是 Office 365 基础设施中运行所需的“批量操作”。

您可以在文章 - 使用 PowerShell 添加电子邮件地址 | 中阅读有关目录同步环境的更多信息。办公室 365 |第 3 部分#13。

使用测试邮箱(实验室邮箱)

当我们实现“批量进程”时,进程运行“一组对象”,例如 Exchange Online 邮箱。

在下一节中,我想回顾一下创建“试点 Exchange Online 邮箱”的重要需求,我们可以将其用作测试特定批量操作的测试邮箱。

为了能够测试批量命令的影响,建议创建一个“测试 Exchange Online 邮箱”,它将充当代表实际生产对象的“数组”。

从技术上讲,我们可以通过多种方法创建数组。

在我们的示例中,我们通过使用特殊字符进行标记来“区分”将充当“测试邮箱”的特定 Exchange Online 邮箱。

为了将这些 Exchange Online 邮箱与其他邮箱区分开来,我们使用名为 CustomAttribute1 的字段向每个“测试邮箱”添加自定义属性。

我们在示例中使用的文本字符串是TestMailbox

第 1 步 - 创建数组

要创建一个包含 CustomAttribute1 中具有特定值的所有“测试 Exchange Online 邮箱”的数组,我们使用 Where 语句,在该语句中我们要求仅查看Exchange Online 邮箱,其 CustomAttribute1 字段的值为 TestMailbox

PowerShell 命令的示例:

Get-Mailbox | Where {$_.CustomAttribute1 -eq 'TestMailbox'}

步骤 2 - 定义一个“存储”数组成员的变量。

为了能够操作数组中的“成员”,我们定义一个变量作为存储数组成员的“逻辑容器”。

在我们的示例中,我们定义一个名为 - $AllMailboxes 的变量,用于存储 PowerShell 过滤器搜索查询的结果。

PowerShell 命令的示例:

$AllMailboxes = Get-Mailbox | Where {$_.CustomAttribute1 -eq 'TestMailbox'}

稍后,我们将使用 PowerShell 批量命令,该命令将“访问”创建的变量中存储的信息,并为数组中的每个成员“执行某些操作”。

使用 ForEach 语句批量添加电子邮件地址

在以下部分中,我们将回顾使用 PowerShell 脚本以批量模式向现有 Exchange Online 收件人添加新电子邮件地址的过程。

“批量处理”是通过涉及几个“PowerShell 组件”来实现的,例如使用 PowerShell ForEach Where 语句,创建一些用于存储数组成员和每个成员、从 CSV 文件导入信息、创建变量等的 PowerShell cmdlet。

在以下部分中,我将提供有关我们使用的 PowerShell 命令语法的基本说明。

如果您想更详细地了解ForEach语句循环过程以及PowerShell环境中“变量”的使用,您可以阅读以下文章:

  • 使用“ForEach”PowerShell 命令通过数组创建循环 |基本介绍 |第 1 部分#2
  • 使用“ForEach”语句和变量通过数组创建循环 | PowerShell环境|第 2 部分#2

如果您想了解有关如何使用 PowerShell Where 过滤器来创建过滤搜索查询的更多信息,您可以阅读以下文章:

  • 使用 PowerShell 查看 Exchange Online 对象 |第 3 部分#3
  • 使用 PowerShell 查看 Office 365 对象 |第 2 部分#3

使用新域名后缀向所有邮箱收件人添加其他电子邮件地址(别名)|批量模式

在下一节中,我们将回顾使用 PowerShell 批量脚本的过程,该脚本将为每个 Exchange Online 收件人执行添加使用新域名后缀的新别名电子邮件地址的任务。

  • 我们公司使用公共域名 - o365info.com
  • 我们公司购买了额外的域名 - o365pilot.com

目前,所有公司用户都有一个使用域名后缀的电子邮件地址 - “o365info.com”。

我们被要求落实以下任务:

  • 向所有公司用户(Exchange Online 收件人)添加一个附加电子邮件地址(代理电子邮件地址),其中包含“新域名”后缀 - “o365pilot.com“。
  • 新电子邮件地址的“别名部分”(左侧部分)应与每个 Exchange Online 收件人用作主电子邮件地址的现有别名相同。
  • 新电子邮件地址不会取代现有的主电子邮件地址,而是将添加为附加电子邮件地址(别名、代理电子邮件地址)。
  • Exchange Online 收件人的所有现有别名电子邮件地址和其他地址(例如 SIP 地址)都将保留

在下图中,我们可以看到组织E-mail地址的结构以及所需的结果:

[玩转系统] 使用 PowerShell - 批量模式添加电子邮件地址 |办公室 365 |第 4 部分#13

例如,

  • 名为 John 的用户当前的主要电子邮件地址是 - [email protected]
  • 我们想要向
    名为John的收件人添加一个额外的电子邮件地址(代理电子邮件地址)。
  • 附加电子邮件地址将是以下电子邮件地址 - “[email protected]

在下图中,我们可以看到名为 - John 的特定 Exchange Online 收件人的请求结果示例。

[玩转系统] 使用 PowerShell - 批量模式添加电子邮件地址 |办公室 365 |第 4 部分#13

PowerShell 命令结构

为了能够为所有 Exchange Online 收件人运行所需的更新,我们将使用 PowerShell ForEach 语句(带有变量组合),该语句将循环遍历所有现有 Exchange Online 邮箱,并运行所需的任务 - 为每个 Exchange Online 邮箱添加新的电子邮件别名。

第 1 步:我们使用名为 $AllMailboxes 的变量来存储有关所有现有 Exchange Online 邮箱的信息。

第 2 步:我们定义一个名为 $NewAddress 的变量,该变量是为了存储新电子邮件地址而创建的。新电子邮件地址是通过使用现有 Exchange 收件人别名 ($Mailbox.Alias) + 带有“新域名后缀@o365pilot.com”的字符串的组合来创建的。

第3步:我们创建一个“数组”,以以下方式存储所有收件人现有电子邮件地址+新电子邮件地址 - $Mailbox.EmailAddresses += $NewAddress
我们使用此步骤是为了避免现有电子邮件地址被删除并替换为新电子邮件地址的情况。

步骤 4: 我们要求 PowerShell 为每个收件人“设置”一个新电子邮件地址(别名电子邮件地址),方法是添加新电子邮件地址(新电子邮件地址)地址(域名后缀为 o365pilot.com)添加到现有电子邮件地址数组中。

$Domainsuffix = Read-Host "Type the name of the Domain name suffix"
$AllMailboxes = Get-Mailbox -ResultSize Unlimited
Foreach ($Mailbox in $AllMailboxes)
{
# Creating NEW E-mail address that contracted in the following way: Take the existing recipient Alias name + use the NEW Domain name as a domain suffix + “Bind” the Alias name + the NEW Domain name suffix.
$NewAddress = $Mailbox.Alias + "@$Domainsuffix"
# “Store” all existing E-mail addresses + add the NEW E-mail address as an additional E-mail address.
$Mailbox.EmailAddresses += $NewAddress
# Assign the NEW E-mail address to the existing Exchange Online recipient
Set-Mailbox -Identity $Mailbox.Alias -EmailAddresses $Mailbox.EmailAddresses #-whatif
}

使用定义收件人“数组”的变量

定义 Exchange Online“收件人数组”的变量 $AllMailboxes 非常“灵活”

我们可以将许多不同类型的 Exchange Online 收件人定义为成员或“数组”。

选项 1

定义一个场景,在该场景中,我们希望批量命令将附加电子邮件地址添加到所有“Exchange Online 邮箱”。 ”

在这种情况下,批量命令将附加电子邮件地址添加到各种类型的 Exchange Online 邮箱收件人,例如 - 房间邮箱、共享邮箱和用户邮箱。

$AllMailboxes = Get-Mailbox -ResultSize Unlimited

选项 2

定义一个场景,在该场景中,我们希望批量命令仅将其他电子邮件地址添加到“Exchange Online 用户邮箱”。 ”

$AllMailboxes = Get-MailBox -Filter '(RecipientTypeDetails -eq "UserMailbox")'

选项3

定义一个方案,在该方案中,我们希望批量命令仅向所有现有 Exchange Online 收件人添加附加电子邮件地址。

在这种情况下,批量命令将附加电子邮件地址添加到各种类型的 Exchange Online 收件人,例如组、邮件联系人、邮箱收件人等。

$AllMailboxes = Get-recipient -ResultSize Unlimited

选项 4

定义一个方案,在该方案中,除了从 Exchange 本地环境同步的收件人之外,我们希望批量命令将附加电子邮件地址添加到 Exchange Online 收件人。

$AllMailboxes = Get-recipient -ResultSize Unlimited | Where {$_.Capabilities -nq "MasteredOnPremise"}

选项5

定义一个方案,在该方案中,我们希望批量命令将额外的电子邮件地址添加到定义为“测试邮箱”的 Exchange Online 收件人 Exchange Online 邮箱中。 ”

在这种情况下,批量命令将仅更新 customattribute1 值为“TestMailbox”的 Exchange Online 邮箱。 ”

$AllMailboxes = Get-Mailbox | Where {$_.CustomAttribute1 -eq 'TestMailbox'}

将主电子邮件地址域名后缀替换为新域名后缀 |批量模式

在下一节中,我们将回顾使用 PowerShell 批量脚本的过程,该脚本将执行以下任务:将现有的主电子邮件地址替换为使用不同域名后缀的新主电子邮件地址。

  • 我们公司使用公共域名 - o365info.com
  • 我们公司购买了额外的域名 - o365pilot.com

目前,所有公司用户都有一个使用
域名后缀的电子邮件地址 - o365info.com

我们被要求落实以下任务:

  • 将使用域名 com 的当前主电子邮件地址替换为使用域名后缀 - o365pilot.com 的新主电子邮件地址
  • Exchange 收件人的别名(电子邮件地址的右侧部分)将保持不变。换句话说,我们希望保留当前主电子邮件地址中的现有别名,并用新的域名后缀替换“左侧部分”(域名后缀)。
  • 之前的主电子邮件地址不会被删除,而是保存为别名电子邮件地址
    (附加电子邮件地址)。
  • 收件人的所有现有别名电子邮件地址和其他地址(例如 SIP 地址)将被保留。

在下图中,我们可以看到组织E-mail地址的结构以及所需的结果:

[玩转系统] 使用 PowerShell - 批量模式添加电子邮件地址 |办公室 365 |第 4 部分#13

在下图中,我们可以看到名为 John 的特定 Exchange Online 收件人的请求结果示例。

[玩转系统] 使用 PowerShell - 批量模式添加电子邮件地址 |办公室 365 |第 4 部分#13

PowerShell 命令结构

我们在此场景中使用的 PowerShell 命令与我们在上一个场景中使用的 PowerShell 命令类似。

主要区别在于,在本例中,我们添加了一个额外的 PowerShell 命令,该命令将每个收件人的主电子邮件地址设置为使用新电子邮件地址。

在我们的示例中,我们希望使用“
o365pilot.com”域后缀替换现有的主电子邮件地址。

设置主电子邮件地址

要设置主电子邮件地址,我们使用 PowerShell 参数 WindowsEmailAdres

我们在场景中使用的 PowerShell 语法是:

Set-Mailbox -Identity $Mailbox.Alias -WindowsEmailAddress $NewAddress

创建“新电子邮件地址”结构

为了创建新电子邮件地址所需的命名约定,我们使用与之前场景中使用的相同的“技巧”。

我们创建一个变量来创建新的电子邮件地址。
电子邮件地址的“左侧部分”(“别名”)取自每个 Exchange 收件人拥有的现有别名。

PowerShell 会将现有别名“绑定”到新域名后缀(电子邮件地址的右侧部分)。

我们使用的语法是 - $NewAddress=$Mailbox.Alias + “@o365pilot.com”

我们使用的 PowerShell 脚本语法是:

$AllMailboxes = Get-Mailbox -ResultSize Unlimited
Foreach ($Mailbox in $AllMailboxes)
{
# Creating NEW E-mail address that contracted in the following way: Take the existing recipient Alias name + use the NEW Domain name as a domain suffix + “Bind” the Alias name + the NEW Domain name suffix.
$NewAddress = $Mailbox.Alias + "@o365pilot.com"
Set-Mailbox -Identity $Mailbox.Alias -WindowsEmailAddress $NewAddress #-whatif
}

当前文章系列的下一篇文章

使用 PowerShell 添加电子邮件地址 - 从 CSV 文件导入 |批量模式 |办公室 365 |第 5 部分#13

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯