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

[玩转系统] 使用 PowerShell 和 Graph API 报告 Exchange Online 邮箱内容

作者:精品下载站 日期:2024-12-14 04:07:27 浏览:15 分类:玩电脑

使用 PowerShell 和 Graph API 报告 Exchange Online 邮箱内容


列出邮箱项目以了解其中有什么

八月份,我写了一篇关于如何编写 PowerShell 脚本来清理邮箱的文章。我出于自己的目的编写了该脚本,以演示当您混合来自 Exchange Online 管理模块的 cmdlet 和 Microsoft Graph API 查询时它的强大功能。然而,并不是每个人都在寻找一个可以删除一堆邮件的脚本,尤其是可以处理组织中每个邮箱的脚本。有些人对任何代码(包括 Search-Mailbox cmdlet)都持谨慎态度,如果使用不正确的查询,则可能会出现意外结果。

我需要另一种方式来展示 Exchange/Graph 组合的强大功能,最终编写了一个脚本来报告邮箱内容。毕竟,每个人都喜欢报告,并且大多数人都是通过编写脚本来生成报告来开始他们的 PowerShell 编码生活,就像 Active Directory 中的所有用户帐户、Exchange 中的所有邮箱或 SharePoint 中的网站一样。那么我们就来说说如何编写一个报告邮箱内容的脚本。

为什么需要图表来报告邮箱内容?

Exchange Online PowerShell 模块包含数百个 cmdlet,允许开发人员自动执行管理操作。您可以列出租户中的邮箱并报告所有文件夹,包括它们的大小以及每个文件夹中的项目数。您甚至可以报告邮箱中的隐藏文件夹,例如 Teams 和 Yammer 等应用程序用于存储合规性记录的文件夹。但您无法报告有关文件夹中项目的任何信息。这是因为 Microsoft 设计了 Exchange Online 模块用于管理操作,而不是与邮箱内容交互。

Exchange Web 服务 (EWS) 长期以来一直是邮箱交互的指定 API。 Outlook for Mac 等客户端使用 EWS 访问 Exchange 并列出、阅读、发送消息、创建文件夹等。 EWS 是一个功能强大的 API,但需要时间来掌握,而 Microsoft 已经明确表示 Microsoft Graph API 是前进的方向。

邮箱内容脚本中的步骤

出于实际和务实的考虑,我首先重新利用了邮箱清理脚本中的一些代码。当有一些完美的代码可用时,重新创建一个轮子是没有意义的。然后我创建了代码来执行以下操作。

索要邮箱进行处理。由于某些邮箱的大小,我认为创建所有邮箱中的项目报告不是一个好主意。该脚本请求一个要处理的名称,并检查该名称以确保它是有效的邮箱。您可以使用邮箱别名、显示名称、用户主体名称或主 SMTP 地址来标识邮箱。

  • 创建邮箱中所有文件夹(包括子文件夹)的列表。每个邮箱中都存在多个实用程序文件夹(例如同步问题和对话历史记录)。该脚本从要处理的文件夹列表中删除这些文件夹。数组定义要忽略的文件夹集。尽管它通常包含许多项目,但我也选择忽略“已删除项目”文件夹。您可以更新数组以确定要包含或排除的文件夹。
  • 出于测试目的,我应用了一个过滤器来获取一年以上的邮箱项目。如果您想从文件夹中获取所有项目,请删除过滤器。
  • 由于某些文件夹包含数千个项目,因此这通常是脚本中最长的部分。例如,根据服务负载,处理包含 10,000 个项目的文件夹最多可能需要一分钟的时间。
  • 该图表以三个数组的形式返回邮件收件人信息(对于“收件人”、“抄送”和“密件抄送”收件人)。需要进行一些操作才能从阵列中提取收件人,以便更容易报告。
  • 默认情况下,图形消息 API 不返回项目的大小。 Graph API 中可用的项目大小是指单值扩展属性,该属性必须显式包含在要获取的属性集中。获取扩展属性的代码稍微复杂一些,因为您必须使用具有 URL 编码的 MAPI 标识符来引用该属性。

该脚本使用已注册的 Entra ID 应用程序,该应用程序分配了 Mail.Read.All 权限。此权限允许应用程序从租户中的任何邮箱读取消息。这是应该非常小心的强大应用程序权限之一。

提取所有数据后,我使用 ImportExport PowerShell 模块将结果输出到 Excel 工作簿中(图 1)。

[玩转系统] 使用 PowerShell 和 Graph API 报告 Exchange Online 邮箱内容

您可以从 GitHub 下载完整的脚本。

使用邮箱内容报告

我个人使用该报告的目的是让我能够查看文件夹的内容并选择要删除的项目。我处理此问题的方法是使用工作簿中的项目作为要删除的目标。我想保留的所有内容都会被删除,留下的项目将成为另一个脚本的输入,以从邮箱中删除这些项目。至少,理论上是这样。我还没有写第二个剧本,但我预计这不会很困难。

步骤是:

  • 阅读工作簿中的项目。
  • 使用为每条消息捕获的标识符来删除该消息(可能使用脚本中的代码来清理邮箱)。
  • 迭代直到删除最后一项。

当然,可能需要更多代码来完善脚本,但 PowerShell 的优点之一是您可以使用相对少量的代码自动执行操作。至少,我一直这么告诉自己。

Microsoft 平台迁移规划和整合

简化迁移规划,克服迁移挑战,更快地完成项目,同时最大限度地降低成本、风险和对用户的干扰。

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

取消回复欢迎 发表评论:

关灯