添加PnP PowerShell后Azure函数调用Graph遇类型加载错误
问题分析:加载Microsoft.Graph.Core类型失败(PnP.PowerShell与Microsoft.Graph冲突)
问题背景
- 运行环境:PowerShell 7.4 作为运行时的Azure Function
- 依赖模块:PnP.PowerShell、Microsoft.Graph、ExchangeOnlineManagement(已在requirements文件中指定版本)
- 异常表现:单独使用Microsoft.Graph时
Get-MgUser执行正常,添加PnP.PowerShell模块后,执行该命令抛出错误:
Could not load type 'Microsoft.Graph.Authentication.AzureIdentityAccessTokenProvider' from assembly 'Microsoft.Graph.Core, Version=1.25.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
错误原因
本质是模块依赖的版本冲突:
- PnP.PowerShell自身会依赖特定版本的
Microsoft.Graph.Core(通常是相对老旧的版本),而你当前使用的Microsoft.Graph模块需要的是更高版本的Microsoft.Graph.Core(即报错里的1.25.1.0)。 - 当两个模块同时加载时,PowerShell会优先加载PnP.PowerShell带来的旧版
Microsoft.Graph.Core,导致Microsoft.Graph模块找不到它需要的AzureIdentityAccessTokenProvider类型——这个类型是在较新的Microsoft.Graph.Core版本中才引入的,旧版根本没有这个类型定义。
解决方案
- 统一兼容的模块版本
查PnP.PowerShell的官方版本说明,找到它兼容的Microsoft.Graph.Core版本,然后把你的Microsoft.Graph模块降级到对应兼容的版本;或者尝试升级PnP.PowerShell到最新版,部分新版已经更新了对Microsoft.Graph.Core的依赖,可能和你当前的Microsoft.Graph版本匹配。 - 隔离模块加载
在脚本里用Import-Module -UseWindowsPowerShell(仅限兼容场景),或者通过Start-Job创建独立的PowerShell会话,分别加载PnP和Microsoft.Graph模块,避免两个模块的依赖在同一个会话里打架。 - 严格管控requirements文件
确保requirements里指定的所有模块版本是相互兼容的,比如示例配置:
注意:不同版本的PnP.PowerShell对应不同的Microsoft.Graph兼容版本,必须提前验证好。PnP.PowerShell=2.20.0 Microsoft.Graph=1.25.0 ExchangeOnlineManagement=3.4.0 - 清理本地缓存
本地调试时,删除.azurefunctions\workers\powershell\7.4路径下的模块缓存,重新安装指定版本的模块,确保没有遗留的旧版依赖文件干扰。
内容的提问来源于stack exchange,提问作者microsoftdeveloperdesigner
相关产品推荐
相关产品推荐

