[玩转系统] 避免 PowerShell 脚本中常见的图形 API 错误
作者:精品下载站 日期:2024-12-14 04:08:33 浏览:14 分类:玩电脑
避免 PowerShell 脚本中常见的图形 API 错误
使用图形 API 时掌握正确的基础知识
鉴于我撰写的有关基于 Microsoft Graph API 或 Microsoft Graph PowerShell SDK 开发 PowerShell 脚本的文章数量,在从我的 GitHub 存储库下载脚本并尝试运行后,我不可避免地会收到遇到 Graph API 错误的人们的许多问题。他们的租户中的代码。在本文中,我描述了向我报告的一些常见问题以及潜在的解决方案。
它是 PowerShell,所以它是您的代码
PowerShell 的一大优点是,一旦您下载了脚本的副本,它就成为您的代码。代码中没有隐藏秘密,您可以完全控制更改代码以满足您的要求。巨大的责任伴随着巨大的权力,这意味着您负责维护租户的代码。其他人无法访问您的 Microsoft 365 数据。其他人都无法修改分配给 PowerShell 脚本使用的应用程序的图形权限。
因此,支持是您的责任。只有你可以调整租户设置或更新 Azure AD 以解决运行脚本时遇到的问题。将您下载的每个脚本视为潜在危险,直到您完成对其代码的完整端到端审查并准确了解该代码的用途。除此之外,这将识别脚本访问的数据以及图形应用程序权限和 Azure AD 管理角色所需的权限。
正确配置的应用程序是避免图形 API 错误的关键
PowerShell 脚本可以通过两种方式运行 Graph API 请求:
- 使用 Microsoft Graph PowerShell SDK 中的 cmdlet。
- 通过 Invoke-RestMethod cmdlet 传递 URL 以运行图形请求。
在这两种情况下,图形都会通过 Azure AD 中注册的应用程序与脚本进行通信。该应用程序可以是企业应用程序,这意味着它由 Microsoft 或另一方(如 Adobe)创建和维护,并且旨在供多个租户使用,也可以是特定于您的租户的应用程序。两者都是具有服务主体的 Azure AD 客户端应用程序。我们很快就会联系服务主体。
对于许多 PowerShell 脚本来说,与 Graph 进行通信的第一步是向 Azure AD 注册新的客户端应用程序。该过程很简单,会生成通过 Azure 进行身份验证并保护访问令牌所需的三条信息中的两条。这些项目是:
- 客户端(或应用程序)标识符。
- 租户(或目录)标识符。
图 1 显示了已注册客户端应用程序的详细信息,您可以看到客户端标识符和租户标识符。身份验证所需的最后一条信息是证明应用程序身份的某种方法,或者是应用程序已知且 Azure AD 已知的信息。
出于测试目的,脚本通常使用应用程序机密作为身份证明。在生产中使用应用程序机密不是一个好主意(如果将应用程序机密存储在安全的地方(例如 Azure Key Vault),则可能是一个例外)。生产脚本更经常使用基于证书的身份验证,其中应用程序将证书或指纹传递到 Azure AD 以证明其身份。
有了这三条信息,应用程序就可以请求 Azure AD 颁发访问令牌,代码如下:
# Construct URI and body needed for authentication
$uri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$body = @{
client_id = $AppId
scope = "https://graph.microsoft.com/.default"
client_secret = $AppSecret
grant_type = "client_credentials"
}
# Get OAuth 2.0 Token
$TokenRequest = Invoke-WebRequest -Method Post -Uri $uri -ContentType "application/x-www-form-urlencoded" -Body $body -UseBasicParsing
# Unpack Access Token
$Token = ($tokenRequest.Content | ConvertFrom-Json).access_token
Azure AD 访问令牌包含应用程序可以使用的权限的详细信息。保护访问令牌是 PowerShell 脚本成功使用 Graph API 的第一步。访问令牌的有效期约为 59 分钟,之后必须更新才能继续有效。
这不是我,而是应用程序!
图形权限由应用程序持有,不会分配给用于登录 PowerShell 的用户帐户。这与传统的 PowerShell 模块不同,在传统的 PowerShell 模块中,用户帐户所拥有的管理角色决定了 cmdlet 可以执行的操作。
例如,您的帐户可能拥有 Exchange Online 管理员角色,但这并不意味着您可以运行邮箱内容报告脚本来检索有关用户邮箱中内容的信息。当 Graph 评估应用程序是否可以执行获取数据的请求时,它会根据分配给应用程序的权限而不是其他任何内容来执行此操作。
图权限的另一个关键方面是委派权限和应用程序权限之间的区别。简而言之,委派权限允许应用程序访问属于登录帐户的数据。应用程序权限允许应用程序访问整个租户的数据,这就是应用程序必须获得管理员同意才能使用应用程序权限的原因。在大多数情况下,PowerShell 脚本用来执行管理操作的应用程序需要应用程序权限。
图 2 显示了分配了多个图形应用程序权限的应用程序。在大多数情况下,脚本不需要如此严格权限的应用程序。
当人们尝试运行示例脚本时,我遇到的大多数问题都是由于应用程序缺少重要权限或使用委派权限而不是应用程序权限造成的。
服务负责人
每个应用程序都有一个服务主体。考虑服务主体的一种方法是,它是 Azure AD 存储应用程序权限和角色的一种便捷方式。当您在交互式会话中从 Microsoft Graph PowerShell SDK 运行 cmdlet 时,权限来自 Graph PowerShell 应用的服务主体。这是 Microsoft 维护的企业应用程序的示例。应用程序的服务主体拥有交互式会话中 SDK cmdlet 可用的权限。虽然方便,但这种安排的缺点是服务主体可能会获得高度许可。
为了说明这一点,请运行 Get-MgContext cmdlet 来报告 SDK 服务主体所拥有的可用范围(权限):
(Get-MgContext).Scopes
Analytics.Read
Application.Read.All
Application.ReadWrite.All
AppRoleAssignment.ReadWrite.All
AuditLog.Read.All
Channel.ReadBasic.All
ChannelMessage.Read.All
ChannelMessage.Send
ChannelSettings.Read.All
Contacts.ReadWrite
DelegatedPermissionGrant.ReadWrite.All
Directory.AccessAsUser.All
Directory.Read.All
Directory.ReadWrite.All
email
Group.Read.All
Group.ReadWrite.All
GroupMember.Read.All
GroupMember.ReadWrite.All
IdentityProvider.ReadWrite.All
Mail.Read
Mail.ReadWrite
Mail.Send
当您在非交互模式下运行 SDK cmdlet 时,您将使用具有自己的一组权限的已注册客户端应用程序。应用程序可以使用基于证书的身份验证,或者脚本可以使用托管标识在 Azure 自动化中运行,并使用自动化帐户的服务主体来保存其权限。
可怕的 403 错误
如果 Graph 请求产生 403 错误,则意味着应用程序无权发出该请求。换句话说,它没有必要的应用程序权限,并且 Graph 恭敬地拒绝允许访问。如果您看到 403 错误,请检查分配的权限并确保管理员同意应用程序使用这些权限。
在大多数情况下,脚本包含注释来告诉管理员需要哪些权限。如有必要,您可以检查不同的来源以了解发出图形请求需要哪些权限。
Microsoft 的 Graph API 文档始终列出所需的权限。例如,图 3 显示,如果应用具有多个权限之一(包括 Group.Read,All),则可以运行 Graph List Groups API。
Microsoft 的 Graph API 文档最近稳步改进,其中包含可以插入 Graph Explorer 来测试请求的示例。许多 API 现在都包含使用 SDK cmdlet 的 PowerShell 示例。 PowerShell 示例往往非常基础,但足以入门。例如,要获取组列表,List Groups API 文档建议:
Get-MgGroup
该命令有效,但仅获取租户中的前 100 个组。获取所有组的更好示例是:
Get-MgGroup -All
未获得所有预期数据
为了限制资源的潜在压力,图形 API 在包含项目集的页面中返回数据。通常,一个页面包含 100 个项目,对图形 API 的调用将返回这些项目,而不会返回更多项目,即使有更多匹配的项目可用。这种机制称为分页,开发人员有责任检查是否有更多数据可用并继续获取,直到检索到所有数据。
图形请求使用 Top 查询参数一次获取特定数量的项目。然而,Top 参数通常限制为 999 个项目。更好的解决方案是让脚本检查 Graph 请求返回的信息是否包含 nextlink。下一个链接是指向要获取的下一页数据的 URL,其想法是继续获取数据,直到图表不返回下一个链接。通常,脚本包含处理分页的函数(例如,请参阅团队和组活动报告脚本中的 Get-GraphData 函数)。
某些 SDK cmdlet 通过支持 All 参数来强制检索所有匹配数据来处理分页。这些 cmdlet 包括 Get-MgUser、Get-MgGroup 和 Get-MgTeam(仅限测试版)。如果有疑问,请检查文档!
混淆
Microsoft 365 生成大量有关用户活动的数据,这些数据显示在 Microsoft 365、SharePoint Online 和 Teams 管理中心的报告部分中。应用程序通过图形报告 API 检索使用情况数据。为了保护用户隐私,Microsoft 365 实施了一项设置,通过在图表检索使用数据时隐藏显示名称和类似信息来混淆信息(图 4)。该设置位于 Microsoft 365 管理中心“设置”部分的“报告”下。
如果组织选择混淆使用数据,则这些设置会影响所有管理中心以及使用图形报告 API 检索信息的任何其他应用程序。要查看真实数据,您可以在运行报告之前以编程方式更改设置并在运行后恢复。 例如,用户活动报告脚本(用于检索过去 180 天内跨 Exchange Online、Teams、SharePoint Online、OneDrive for Business 和 Yammer 的用户活动统计信息)无法使用模糊数据,因为无法整理数据来自多个工作负载,因此这是在脚本运行之前必须删除混淆的一个很好的例子。
通过掌握正确的基础知识来避免图形 API 错误
如果您掌握了正确的基础知识,那么在 PowerShell 中使用图形 API 并不困难。正确配置应用程序并分配和同意必要的权限应该可以解决大多数潜在问题。之后,代码就是PowerShell,您可以根据需要修复、调整、改编和改进它。
最后,如果脚本使用 Microsoft Graph PowerShell SDK,请确保安装并使用该模块的最新版本。 Microsoft 定期更新 SDK 以修复问题并引入新的 cmdlet。如果工作站运行了过时的模块而出现问题,那将是一件很遗憾的事情。
Microsoft 平台迁移规划和整合
简化迁移规划,克服迁移挑战,更快地完成项目,同时最大限度地降低成本、风险和对用户的干扰。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag