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

[玩转系统] PowerShell 并行处理加速 Microsoft 365 数据检索

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

PowerShell 并行处理加速 Microsoft 365 数据检索


加快大量 Microsoft 365 对象的处理速度

我不像 Michel de Rooij 那样是专业的 PowerShell 人员,所以我会愉快地使用 PowerShell 来完成工作,而不会太关心代码的细节。一旦我学会了如何做某事,我就会倾向于继续使用该技术,这就是为什么我编写的许多脚本都有相似之处。我怀疑我并不是唯一一个在 PowerShell 之旅中不断学习但没有接受过正规培训的人。无论如何,我所做的都是有效的,而且我非常喜欢使用 PowerShell。

这让我很自然地看到了 Nicola Suter 撰写的一篇关于优化 Microsoft Graph PowerShell 脚本的优秀文章。在大型组织中使用 PowerShell 的任何人都应该阅读这篇文章,在这些组织中,通常需要处理数以万计的对象(例如用户帐户或邮箱)。引起我注意的是关于批处理请求的讨论,或者正如 Microsoft 提到的主题:使用 JSON 批处理组合多个 HTTP 请求,这个标题可能不是为了吸引那些寻求好读的人的注意力。

批量 HTTP 请求

无论如何,我们的想法是您最多可以将 20 个单独的 Graph 请求合并到一个 JSON 对象中。该对象使用 HTTP POST 请求传递到批处理端点,该端点负责处理批处理。

为了进一步加快速度,在准备好批次后,您可以利用 PowerShell 7 的并行处理功能来提交批次(Michel de Rooij 在本文中讨论了并行处理)。每个批次都使用包含变量、模块和函数的 PowerShell 运行空间。默认情况下,PowerShell 7 创建五个运行空间用于并行执行,因此批处理中的工作会分为五个运行空间以加快执行速度。显然,对于已经运行得很快的脚本,您不会这样做,但在其他情况下它可能会产生真正的影响。

一批看起来像这样:

Name                           Value
----                           -----
ContentType                    application/json
Uri                            https://graph.microsoft.com/v1.0/$batch
Body                           {…
Method                         Post

批处理要求 Graph 处理的请求包含在正文中的单个 JSON 对象中(因此名称为“JSON 批处理”。每个请求都有一个标识符、方法(在本例中为 GET,因为我们想要检索一些信息) ),以及传递给图表的 URL。

{
  "requests": [
    {
      "Id": 0,
      "Method": "GET",
      "Url": "users/0a6b8952-baca-4019-bdaf-450536c6ece6?$select=id,displayname,assignedLicenses,country,city,jobtitle,officelocation,userprincipalname,businessphones,employeeid,employeehiredate"
    },
    {
      "Id": 1,
      "Method": "GET",
      "Url": "users/28f205c1-95cd-4d64-b998-e5324b4c032f?$select=id,displayname,assignedLicenses,country,city,jobtitle,officelocation,userprincipalname,businessphones,employeeid,employeehiredate"
    },

如果您使用 Graph Explorer 之类的工具来运行请求,则需要构建完整的 URL。例如,https://graph.microsoft.com/V1.0/users/0a6b8952-baca-4019-bdaf-450536c6ece6?$select=id,displayname,signedLicenses,country,city,jobtitle,officelocation,userprincipalname 、businessphones、employeeid、employeehiredate(图 1)。

[玩转系统] PowerShell 并行处理加速 Microsoft 365 数据检索

提高并行执行能力

PowerShell 支持跨五个以上运行空间的并行执行。然而,除非您确定运行 PowerShell 的工作站有足够的资源来满足并行处理产生的需求,否则这不是值得深入研究的事情。有关并行 PowerShell 功能的更多信息,请参阅此 Microsoft 博客。

由于各个运行空间在运行批处理之前需要启动,因此必须以线程安全的方式收集其结果。您不能使用数组或普通列表来实现此目的,但 ConcurrentBag 列表可以工作,并且可以在线程运行时接受来自线程的结果。收集完所有数据后,可以将 ConcurrentBag 转换为普通数组、哈希表或脚本所需的任何形式。

测试并行批处理

Nicola Suter 很好地解释了如何编写脚本来测试并行批处理的有效性。为了熟悉事情的工作原理,我决定更新测试脚本以做一些实际工作并展示该技术的价值。因此,我创建了一个脚本(可从 GitHub 获取)来执行以下操作:

  • 查找所有用户邮箱。
  • 创建批次以根据外部目录对象 ID 邮箱属性(邮箱与所属 Entra ID 帐户之间的链接)从图形列表用户 API 获取用户帐户信息。该请求获取详细信息,例如分配给帐户的许可证以及城市、国家/地区、员工标识符和雇用日期等详细信息。
  • 提交批次。
  • 检索响应并将它们合并到 ConcurrentBag 中。
  • 将 ConcurrentBag 转换为哈希表,以便快速键控访问用户数据。
  • 创建合并邮箱和用户数据的报告,包括将分配的许可证的 SKU 标识符转换为产品名称。为此,我使用有关创建用户许可报告的文章中介绍的技术,根据从 Microsoft 下载的产品信息创建哈希表。
  • 输出 CSV 文件并通过 Out-GridView cmdlet 显示报告(图 2)。

[玩转系统] PowerShell 并行处理加速 Microsoft 365 数据检索

总而言之,一切都很顺利,我对数据检索的速度感到满意。

只是一个测试

我不会假装此示例只是一个测试,旨在演示如何使用一种 Microsoft 365 数据来通过并行批处理执行来驱动其他信息的检索。然而,边做边学是熟悉新技术的好方法,我喜欢批量实验。我将来会记得使用并行处理吗?嗯,这取决于情况和我是否记得!

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

取消回复欢迎 发表评论:

关灯