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

[玩转系统] PowerShell、管道和 Exchange 在线邮箱管理

作者:精品下载站 日期:2024-12-14 04:05:49 浏览:13 分类:玩电脑

PowerShell、管道和 Exchange 在线邮箱管理


管道化 cmdlet

使用 PowerShell,我们有许多 cmdlet 可以执行查询、配置更改等任务。 单个 cmdlet 本身很有用,但能够将信息从一个 cmdlet 提供给另一个 cmdlet 是 PowerShell 的一项非常有用的功能。 PowerShell 使用称为管道的概念来组合两个或多个 cmdlet 以执行内聚任务。管道字符“|”分隔 cmdlet。

在 cmdlet 之间创建管道时,信息从左侧的 cmdlet 传递到右侧的 cmdlet。 请记住,当信息从左向右传递时,PowerShell 将数据存储为对象以供下一个 cmdlet 处理,而不是存储为纯文本。使用对象意味着当管道中的下一个 cmdlet 处理它接收到的数据时,PowerShell 具有最大的灵活性。

实际使用

第一次使用 PowerShell 的人通常最终会使用单个 cmdlet 构建单行语句来查询信息,例如 Get-EXOMailbox 列出 Exchange Online 邮箱或使用 Set-EXOMailbox 更改设置。在这些 cmdlet 之间使用管道可以扩展我们的功能。尽管管道中 cmdlet 的数量没有限制,但请注意不要使其过于复杂,因为这可能会导致意想不到的后果。

这些示例演示如何以不同方式使用管道来列出启用存档的 Exchange Online 邮箱:

Get-EXOMailbox -PropertySets Minimum,Archive | Where ArchiveName -ne $Null

相同的示例,但使用另一个 Pipeline 按 DisplayName 属性添加排序:

Get-EXOMailbox -PropertySets Minimum,Archive | Where ArchiveName -ne $Null | Sort-Object DisplayName

采用前面的示例并添加其他管道来调整输出的格式:

Get-EXOMailbox -PropertySets Minimum,Archive | Where ArchiveName -ne $Null | Sort-Object DisplayName | ft -Auto

使用 cmdlet 来正确处理信息存在一定的操作顺序。 例如,格式化 cmdlet(Ft、Fl、Fw)应添加到管道的末尾。如果没有,PowerShell 会生成错误:

"out-lineoutput : The object of type "Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData" is not valid or not in the correct sequence."

不要尝试在管道中间格式化输出:

Get-EXOMailbox -PropertySets Minimum,Retention | Ft DisplayName,Retention* | Sort-Object DisplayName

执行(在最后格式化):

Get-EXOMailbox -PropertySets Minimum,Retention | Sort-Object DisplayName | Ft DisplayName,Retention*

兼容的 Cmdlet

并非所有 PowerShell cmdlet 都可以通过管道将信息从一个 cmdlet 传输到另一个 cmdlet,这通常是因为一个 cmdlet 生成的对象无法由管道中的下一个 cmdlet 处理。 例如,我们无法将对象从 Get-EXOMailbox Cmdlet 管道传输到 Get-Remote Domain cmdlet,因为第二个 cmdlet 将尝试将邮箱标识作为远程域进行处理,因此会失败。

另一方面,处理类似对象(例如 Get-EXOMailbox 和 Get-MailboxSpellingConfiguration)的 cmdlet 可以在它们之间传输数据,因为第二个 cmdlet 可以接受要处理的邮箱标识。

了解哪些 cmdlet 可以协同工作需要一些经验。从逻辑上讲,我们需要先了解一个 cmdlet 接受的输入内容,然后再从另一个 cmdlet 传递信息。

$_ 管道变量

管道支持特殊的 $_ 变量来标识 PowerShell 正在处理的当前对象。 我们可以通过添加“.”和我们想要的属性(例如 DisplayName 或 Identity)来使用该对象并使用其属性。

$_ 变量的常见用法是引用正在查询的对象的某个属性,并过滤与该属性匹配的所有对象。 这可以在单行以及 Foreach 循环中完成:

在此示例中,我们查找过去 14 天内更新的邮箱:

$Date = (Get-Date).AddDays(-14)
Get-EXOMailbox -InactiveMailboxOnly | Where {$_.WhenChanged -lt $Date}  | Ft

我们还可以使用 $_ 变量来执行其他常见任务。在此示例中,我们搜索位于美国且已分配保留策略的邮箱:

Get-EXOMailbox -PropertySets All | Where {$_.RetentionPolicy -ne $Null} | Where {$_.UsageLocation -eq 'United States'} | Ft DisplayName,PrimarySMTPAddress,RetentionPolicy -Auto

来自美国的所有非活动邮箱列表,按上次更改日期和输出格式排序:

Get-EXOMailbox -InactiveMailboxOnly -PropertySets All | Where {$_.UsageLocation -eq 'United States'} | Sort-Object WhenChanged | Ft DisplayName, WhenCreated, WhenChanged

此示例公开了存储在位于美国的所有邮箱中的可恢复项目。 Foreach-Object 用于将邮箱 GUID 转换为显示名称,以获得更好的输出可读性:

Get-EXOMailbox -Properties UsageLocation | Where {$_.UsageLocation -eq 'United States'} | Get-ExOMailboxFolderStatistics -FolderScope RecoverableItems | Select-Object ContentMailboxGuid, FolderAndSubfolderSize, ItemsInFolderAndSubfolders | ForEach-Object { $Mailbox = $_.ContentMailboxGuid; $Name = (Get-ExOMailbox $Mailbox).DisplayName;$_.ContentMailboxGuid = $Name ; Return $_}

现实世界的例子

Foreach 循环是我们利用 $_ 特殊变量来操作数据的另一种方式。

收集邮箱数据时,一项常见任务是检查电子邮件地址以确保 Exchange Online 数据正确。 例如,当用户对象同步到 Azure AD 并且最终用户的 onmicrosoft.com 电子邮件地址创建不正确或未按预期创建时,可能会出现对象冲突或别名不正确。 列出 EmailAddresses 属性会显示前缀为“SIP:”或“SMTP:”或“smtp:”的代理电子邮件地址。 我们可以使用 $_ 删除借口以仅显示电子邮件地址:

Get-ExOMailbox  | Select-Object DisplayName,RecipientTypeDetails,EmailAddresses | Foreach-Object { $EmailAddresses = $_.EmailAddresses;$TrimmedEmails = @();Foreach ($EmailAddress in $EmailAddresses) { $Email = $EmailAddress.split(':')[1]; $TrimmedEmails += $Email}; $_.EmailAddresses = $TrimmedEmails;Return $_}

经过一些更改,我们可以使用代码创建 SMTP、SIP 和 SharePoint Online 代理地址列表:

仅限 SMTP

Get-ExOMailbox  | Select-Object DisplayName, RecipientTypeDetails,EmailAddresses | Foreach-Object { $EmailAddresses = $_.EmailAddresses;$TrimmedEmails = @();Foreach ($EmailAddress in $EmailAddresses) { if ($EmailAddress -like 'smtp*') { $Email = $EmailAddress.split(':')[1]; $TrimmedEmails += $Email}}; $_.EmailAddresses = $TrimmedEmails;Return $_}

[玩转系统] PowerShell、管道和 Exchange 在线邮箱管理

仅限 SIP

SIP 地址用于 Teams 通信,包括电话(图 2:)

Get-ExOMailbox | Select-Object DisplayName, RecipientTypeDetails,EmailAddresses | Foreach-Object { $EmailAddresses = $_.EmailAddresses;$TrimmedEmails = @();Foreach ($EmailAddress in $EmailAddresses) { if ($EmailAddress -like 'sip*') { $Email = $EmailAddress.split(':')[1]; $TrimmedEmails += $Email}}; $_.EmailAddresses = $TrimmedEmails;Return $_}

[玩转系统] PowerShell、管道和 Exchange 在线邮箱管理

在数据格式化的最后,请注意“Return $_”的用法,它允许将重新格式化的数据按字面量返回到管道中的对象。 在我们的示例中,我们仅返回格式化的代理地址,而不是邮箱对象的 EmailAddresses 属性中保存的值。

导出-CSV

PowerShell 管道可以将输出格式化为文件以用于报告目的。例如,我们可以创建来自美国的所有非活动邮箱的列表,按上次更改日期和输出格式排序:

Get-EXOMailbox -InactiveMailboxOnly -PropertySets All | Where UsageLocation -eq 'United States' | Sort-Object WhenChanged | Select-Object DisplayName,WhenCreated,WhenChanged | Export-CSV c:\reports\InactiveUSMailboxes.csv -NoType

Out-GridView

我们还可以通过管道输出到 Out-GridView cmdlet 以在弹出窗口中查看数据:

Get-EXOMailBox | Out-GridView

[玩转系统] PowerShell、管道和 Exchange 在线邮箱管理

Out-GridView 的一个有用功能是使用 PassThru 开关,该开关允许操作员选择值并仅将这些值传递回 PowerShell,以便管道中的下一个 cmdlet 进一步处理。

Get-EXOMailbox | Out-GridView -PassThru | Get-EXOCasMailbox | Ft DisplayName,*Enabled

[玩转系统] PowerShell、管道和 Exchange 在线邮箱管理

单击弹出框中的“确定”会将选定的邮箱传递给 Get-EXOCasMailbox 进行处理,以显示允许邮箱连接的属性:

[玩转系统] PowerShell、管道和 Exchange 在线邮箱管理

[玩转系统] PowerShell、管道和 Exchange 在线邮箱管理

结论

PowerShell 管道将非常有用的 cmdlet 组合在一起来处理数据。如果使用得当,管道是通过一系列步骤处理数据以自动执行常见管理操作的好方法。掌握管道,或者至少熟悉管道 cmdlet,是使用 PowerShell 管理 Microsoft 365 租户的任何人的一项基本技能。

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

取消回复欢迎 发表评论:

关灯