本文提供有关与 Microsoft Graph API 相关的已知问题的信息。
身份验证
在 PowerShell 和 CLI 应用同意期间出现发布者“未验证”消息
同意页面显示适用于 PowerShell 和 CLI 的命令行应用来自未经验证的发布者。
解决方法
要删除“未经验证”消息,您可以自己进行应用程序注册,并在注册中将自己设置为已验证的发布者。 需要完成发布者验证过程,并在 Microsoft Graph PowerShell SDK 上使用应用 ID,如下所示:
Connect-MgGraph -AppId "{your-own-app-id}" -Scopes "scope"
对 CSP 应用的预授权不适用于一些客户租户
在某些情况下,云解决方案提供商 (CSP) 应用的预先同意可能不适用于某些客户租户。
对于使用委派权限的应用,首次将此应用用于新客户租户时,登录后可能会看到以下错误:AADSTS50000: There was an error issuing a token。
对于使用应用权限的应用,应用可以获取令牌,但在调用 Microsoft Graph 时会意外看到“拒绝访问”消息。
我们正在努力解决此问题,以便所有 CSP 客户租户都能获得预先同意。
解决方法
要取消阻止开发和测试,可以使用以下解决方法。
注意
这不是永久性解决方案,旨在取消阻止开发。 问题修复后,将不需要此解决方法。 修复到位后,无需撤消此解决方法。
打开 Azure AD v2 PowerShell 会话,并通过在登录窗口中输入管理员凭据来连接到客户租户。 可以从此处下载并安装 Azure AD PowerShell V2。
Connect-AzureAd -TenantId {customerTenantIdOrDomainName}创建 Microsoft Graph 服务主体。
New-AzureADServicePrincipal -AppId 00000003-0000-0000-c000-000000000000
CSP 应用不支持 Azure AD v2.0 终结点
云解决方案提供商 (CSP) 应用必须从 Azure AD (v1) 终结点获取令牌,才能在其合作伙伴管理的客户中成功调用 Microsoft Graph。 目前,不支持通过较新的 Azure AD v2.0 终结点获取令牌。
日历
将大文件附加到事件时出错
尝试将大型文件附加到共享或委派的邮箱中的 Outlook 邮件或事件时,具有委派权限的应用将返回 HTTP 403 Forbidden。 使用委派权限,仅当邮件或事件在已登录用户的邮箱中时,createUploadSession 才会成功。
更改通知
Teams 应用安装的升级事件 聊天范围内的更改通知未传递
创建 Teams 应用安装更改通知的订阅时,如果范围特定于聊天或包含聊天,则不会向订阅者发送升级事件/通知。
例如:如果客户订阅 /appCatalogs/teamsApps/{teams-app-id}/installations?$filter=(scopeInfo/scope eq 'groupChat'),则他们不会收到升级/更新事件的通知。 但是,它们会收到有关安装和删除的其他通知。
另一个示例:如果客户订阅 /appCatalogs/teamsApps/{teams-app-id}/installations,则他们不会收到聊天中专门发生的升级/更新事件的通知。 但是,他们会在团队和用户的个人范围内接收所有其他形式的通知。 但是,在聊天中,他们只收到安装和删除通知。
解决方法
目前没有此问题的解决方法。
客户预订
查询 bookingBusinesses 时出错
当组织有多个 Bookings 企业并且发出请求的帐户不是管理员时,获取 bookingBusinesses 列表失败,并出现以下错误代码:
{
"error": {
"code": "ErrorExceededFindCountLimit",
"message": "The GetBookingMailboxes request returned too many results. Please specify a query to limit the results."
}
}
解决方法
可以通过包含查询参数来限制请求返回的业务集,例如:
GET https://graph.microsoft.com/beta/bookingBusinesses?query=Fabrikam
Delta 查询
OData 上下文返回不正确
跟踪关系更改时,OData 上下文有时无法正确返回。
设备和应用管理
不支持访问和更新部署访问群体。
当前不支持访问和更新通过 Intune 创建的 部署 资源上的部署访问群体。
- 列出部署访问群体成员 和 列出部署访问群体排除项 返回
404 Not Found。 - 更新部署访问群体成员和排除项 或 按 ID 更新 返回
202 Accepted,但不更新访问群体。
组
非管理员用户无法在组创建或更新期间将自己添加为组所有者
当非管理员用户调用 创建组 API、 更新组 API 或 更新插入组 API 并在集合的 owners@odata.bind 请求正文中添加其用户 ID 时,请求失败并显示错误 400 Bad Request 代码,并显示消息“请求包含具有重复值的属性”。非管理员用户无法将自己显式添加为组所有者。
解决方法
此错误没有解决方法。
默认情况下,通过 创建组 API 或更新 插入组 API 创建安全或 Microsoft 365 组的非管理员用户,如果未指定任何组所有者,则将自动添加到组的 所有者 集合中。 如果他们将其他人指定为组所有者,则非管理员组创建者仍会自动添加到安全组的 所有者 集合中,但不会添加到 Microsoft 365 组中。 在组更新期间,用户仍然无法将自己添加到 所有者 集合中。
GET /groups/{id}/members 在 v1.0 中不返回服务主体
v1.0 终结点上的 “列出组成员” API 操作当前不会返回任何可能是所查询组成员的服务主体。
解决方法
作为解决方法,请使用以下选项之一:
- 在 beta 终结点上使用 “列出组成员 ”API 操作。
- 使用
/groups/{id}?$expand=membersAPI 操作。
身份和访问
在 /subscribedSkus 和 /domains 上使用特定查询参数未返回预期结果
以下针对 subscribedSkus 和 域 实体的查询参数用法可能不会返回预期结果:
- 在 subscribedSkus 或域实体上使用
$search - 在域实体上和
$filter在域实体上的$top使用
目前,这些参数被有效地忽略,查询不会返回预期的结果。
解决方法
为了防止业务流程受到任何中断,建议修改应用程序代码,从针对 subscribedSkus 或 域 实体的查询中删除这些查询参数的使用,并在客户端运行搜索、顶部和筛选。
在委派方案中配置联合域需要 Directory.AccessAsUser.All 权限
创建 internalDomainFederation、Update internalDomainFederation 和删除 internalDomainFederation 可能需要授予对 Directory.AccessAsUser.All 权限的许可。 此要求是一种临时解决方法,直到我们为管理联合域提供更精细的委派权限。
声明映射策略可能需要同意其他权限
claimsMappingPolicy API 可能需要得到 LIST /policies/claimsMappingPolicies 和 GET /policies/claimsMappingPolicies/{id} 方法的 Policy.Read.All 和 Policy.ReadWrite.ConditionalAccess 授权,如下所示:
- 如果没有 claimsMappingPolicy 对象可用于在 LIST 操作中检索,则任一权限都足以调用此方法。
- 如果有要检索的 claimsMappingPolicy 对象,则应用必须同时同意这两项权限。 如果没有,则返回
403 Forbidden错误。
将来,任一权限都足以调用这两种方法。
条件访问策略需要同意其他权限
conditionalAccessPolicy API 当前需要同意 Policy.Read.All 权限才能调用 POST 和 PATCH 方法。 将来可以通过 Policy.ReadWrite.ConditionalAccess 权限读取目录中的策略。
不支持预置预注册密钥
FIDO2 预配 API 支持添加创建时处于活动状态的密钥。 预配(其中在设备制造或分发期间向 Microsoft Entra ID 预注册密钥,并在管理员启用它们之前保持禁用状态)在当前 v1.0 版本中不受支持。
FIDO2 预配 API 要求启用自助设置
若要使用 FIDO2 预配 API (创建 fido2AuthenticationMethod) ,管理员必须在 FIDO2 身份验证方法策略中启用 “允许自助设置 ”。 在 v1.0 中,此设置还支持通过“我的登录”进行最终用户 FIDO2 注册。目前不支持独立于自助服务注册启用基于 API 的预配。
Microsoft Entra 外部 ID:外部用户无权访问我的登录,因此启用此设置不会影响外部用户的自助注册。 管理员必须仍启用该设置才能使用预配 API。
JSON 批处理
请求依赖项受限
单个请求可能依赖于其他单个请求。 目前,请求只能依赖于一个其他请求,并且必须遵循以下三种模式之一:
- 并行 - 没有单个请求声明 dependsOn 属性中的依赖项。
- 串行 - 所有单个请求都依赖于上一个单独的请求。
- 相同 - 在 dependsOn 属性中声明某一依赖项的所有单个请求都声明相同的依赖关系。 Note: 使用此模式发出的请求将按顺序运行。
随着 JSON 批处理技术日臻成熟,这些限制将会被取消。
邮件
使用不可变 ID 对消息 API 的增量调用
在某些情况下使用不可变 ID 调用消息 API 时 /delta (例如,当邮件移出文件夹,然后移回) 时,可能会错过一些更改通知。
用于创建草稿的 comment 参数不是邮件正文的一部分
用于创建回复或转发草稿的 comment 参数 (createReply、 createReplyAll、 createForward) 不是回复消息草稿正文的一部分。
查询参数
对于编码的与号 (&) 字符,目录对象的$search失败
根据 RFC 3986 和“编码 查询参数”中所述,查询字符串中的保留字符必须采用百分比编码。 例如,在像“Hiking&Recreation”这样的组名称上,语 $search 法如下:
GET https://graph.microsoft.com/v1.0/groups?$search="displayName:Hiking%26Recreation group"
Microsoft Graph 当前针对包含编码的与号 (&) 字符的搜索在 v1.0 终结点上返回 400 Bad Request 错误代码,并显示以下错误消息: Unrecognized query argument specified: ''.。 相同的请求在 beta 终结点上成功。
某些应用在 v1.0 终结点上实现了双倍编码作为解决方法。 例如,双倍编码的请求将变为 /users?$search="displayName:Hiking%2526Recreation group"。 但是,这不是官方推荐的解决方法。
解决方法
解决方法 1:
在 v1.0 终结点上,使用正确的百分比编码时,请包含 Prefer 设置为 legacySearch=false的请求标头。 例如:
GET https://graph.microsoft.com/v1.0/groups?$search="displayName:Hiking%26Recreation group"
ConsistencyLevel: eventual
Prefer: legacySearch=false
将来,v1.0 终结点上的行为将得到纠正,并且无需包含此标头。
解决方法 2:
更正 v1.0 终结点上的行为后,依赖于双倍百分比编码的应用可能会发生重大更改,除非它们被选择通过将请求标头设置为 PreferlegacySearch=true来维持其实现。 例如:
GET https://graph.microsoft.com/v1.0/groups?$search="displayName:Hiking%2526Recreation group"
ConsistencyLevel: eventual
Prefer: legacySearch=true
查询参数存在一些限制
以下限制适用于查询参数:
- 不支持多个命名空间。
- 用户、组、设备、服务主体和应用程序不支持开启
$ref和强制转换 GET 请求。 - 不支持
@odata.bind。 这意味着无法正确设置组上的 acceptedSenders 或 rejectedSenders 导航属性。 -
@odata.id在使用最少元数据时) 的非包含导航 (如消息上不存在。 -
$expand关于目录对象的关系:- 最多返回 20 个对象,但
/users?$expand=registeredDevices除外,它最多返回 100 个对象。 - 不支持
@odata.nextLink。 - 不支持一级以上的扩展。
- 不支持嵌套其他查询参数,例如
$filter在查询中$expand嵌$select套。
- 最多返回 20 个对象,但
-
$filter:-
/attachments终结点不支持筛选器。 如果存在,将忽略$filter参数。 - 不支持跨工作负载筛选。
- 使用
in运算符时,默认情况下,请求在 filter 子句中限制为 15 个表达式,或者在使用高级查询功能时,URL 长度限制为 2,048 个字符。 - 使用
eq运算符进行筛选时,匹配值的最大限制是 120 个字符。 即,$filter=displayName eq 'value-to-match-max-120-char'此限制甚至适用于目录对象上最多可包含 256 个字符的 displayName 等属性。 使用高级查询时,URL 长度限制为 2,048 个字符,而不是匹配值。
-
-
$search:- 全文搜索仅对实体子集(如邮件)可用。
- 不支持跨工作负载搜索。
- Azure AD B2C 租户中不支持搜索。
-
$count:- Azure AD B2C 租户不支持。
- 在查询目录资源时使用
$count=true查询字符串时,该@odata.count属性仅出现在分页数据的第一页上。
- 请求中指定的查询参数可能会自行失败。 对于不受支持的查询参数和不受支持的查询参数组合,情况可能为 true。
搜索
使用损坏的自适应卡创建 externalConnection 将返回 503 服务不可用响应,后跟 409 冲突错误
使用 Microsoft Graph API 创建外部连接时,结果布局的自适应卡已损坏,第一次调用将失败并显示503 Service Unavailable错误。 然后,第二次调用失败并显示 409 Conflict 错误,表明已存在具有相同名称的连接。
虽然第一个请求失败并出现了 503 响应,但仍创建了连接。 但是,由于自适应卡模板已损坏,因此未注册。
网站和列表
关注/取消关注网站与 SharePoint 关注不同步
通过 Microsoft Graph 查询关注的网站时,响应可能产生不正确的结果,并且这些结果可能与 SharePoint 中以下内容的结果不匹配。
解决方法
使用 以下人员和内容 REST API。
团队合作和沟通
列出 callRecords participant_v2可能不会返回所有参与者
在某些极端情况下,请求列出 callRecord 的participants_v2可能会返回不完整的列表。
解决方法
可以利用 callRecord 的现有参与者属性获取完整的参与者列表。
通信呼叫 SDK:启用机器人程序分组时,Teams 客户端上显示的记录的参与者人数不一致
当录制机器人应用程序启用机器人分组时,Teams 客户端显示为正在录制的参与者数量不准确。 由于参与者是分组的,因此记录的显示参与者人数低于实际人数。
解决方法
禁用机器人程序分组以显示准确计数。
callRecords API 将应用程序参与者表示为 communicationsIdentitySet 中的用户
在 callRecord 参与者资源中,应用程序/机器人参与者当前由 communicationsUserIdentity 而不是 communicationsApplicationIdentity 表示。
解决方法
在 callRecord 会话中的 participantEndpoint 资源上使用用户代理 headerValue 来识别应用程序参与者并查看有关应用程序标识的其他详细信息。
通信呼叫 SDK:缺少对增量名单通知模式下的多终结点用例的支持
当同一应用程序或用户使用多个终结点加入同一会议,并且名单通知模式为增量名单时,通信 SDK 提供的参与者名单更新可能无法捕获添加到正在进行的呼叫的其他终结点。
解决方法
名单的旧模式支持多终结点用例。 使用 SDK 版本 1.2.0.7270 或更早版本。
通信调用 SDK:Webhook 消息处理异常:System.Security.Cryptography.CryptographicException
发布的 KB 给使用通信呼叫 SDK 开发的应用程序引入了一个问题。
当机器人尝试应答传入呼叫时,Microsoft Graph AnswerAsync 方法会引发异常。 这与以下 Windows 更新相关:
- 第 22 周 - KB5038282
- 第 19 周 - KB5038283
有关详细信息,请参阅 SHA256 ComputeHash 开始抛出 - Microsoft 社区。
解决方法
回滚 KB,等待 SDK 的更新版本。
针对导出联机会议项目的 API 的更改跟踪请求返回已同步的项目
对 getAllTranscripts 或 getAllRecordings) 请求 (/delta 更改跟踪可能会返回已在早期请求中同步的项目。
当会议有其他不相关的更新(例如添加参与者、备注或文件)时,会发生这种情况。
解决方法
对于响应中的每个项目,请检查录制内容或脚本的 createdDateTime,并将其与之前的同步时间戳进行比较。 如果 createdDateTime 早于上次同步时间戳,则项已同步,可以忽略。
导出联机会议项目的 API 不会返回未启用听录的会议录制内容
getAllRecordings API 不会返回未启用听录的会议的录制内容。
当请求使用 $top 查询参数时,导出联机会议项目的 API 可能不会返回 nextLink
调用 getAllRecordings 或 getAllTranscripts API 时,传递 $top 筛选器可能不会返回 @odata.nextLink,即使有更多项目要导出也是如此。
解决方法
在问题修复之前,请勿传递 $top 查询参数。
导出联机会议项目的 API 可能会在服务更新期间返回重复的项目
在预计于 2026 年 8 月 31 日完成的计划服务更新期间,对 getAllRecordings 或 getAllTranscripts API 的分页请求可能会经历自动分页令牌重置。 请求可以返回具有 200 OK 空集合和 @odata.nextLink. 然后重新启动分页,可以返回之前返回的录制或脚本项。
解决方法
即使集合为空,也可继续关注 @odata.nextLink 。 通过跟踪每个录制内容或脚本的 id 属性来删除重复的后续项目。
将增量查询与这些方法配合使用时,请遵循返回的增量链接,而无需追加或重新应用筛选器。 令牌保留初始请求中的筛选器。 使用令牌提供筛选器将返回一个400 Bad Request作为值的innerError.code响应DeltaFilterNotAllowed。
列出团队成员 在新创建的租户中,API 失败并出现 401 错误
当新创建的租户使用高级 Azure AD 查询功能发送团队成员列表请求时,将发生 HTTP 401 错误。
解决方法
- 调用 列表团队 API 并等待几秒钟。
- 致电
/teams/{id}/members并检查响应成功。
克隆团队方法不包括克隆团队中源团队的所有所有者
调用 克隆团队 方法时,如果源团队包含多个所有者,则克隆团队中仅保留一个所有者。 其他所有者将成为新克隆团队的成员。 无法选择或配置将哪个所有者保留为新团队的所有者。
解决方法
克隆团队后使用 “添加成员 ”方法将原始所有者从成员更新回所有者。
创建频道可以返回错误响应
创建频道时,如果在频道名称中使用特殊字符,则 Get filesFolder API 将返回 400 Bad Request 错误响应。 创建频道时,请确保该频道的 displayName 不会:
- 包含以下任一特殊字符:
~ # % & * { } + / \ : < > ? | ' ". - 以下划线开始 (
_) 或句点 (.) ,或以句点 (.) 结尾。
当请求 URL 包含租户/{cross-tenant-id} 时,无法访问跨租户共享通道
API 调用 teams/{team-id}/incomingChannels 并 teams/{team-id}/allChannels 返回属性, @odata.id 可用于访问通道并在通道对象上运行其他操作。 如果调用从属性返回 @odata.id 的 URL,则请求在尝试访问跨租户共享频道时将失败,并出现以下错误:
GET /tenants/{tenant-id}/teams/{team-id}/channels/{channel-id}
{
"error": {
"code": "BadRequest",
"message": "TenantId in the optional tenants/{tenantId} segment should match the tenantId(tid) in the token used to call Graph.",
"innerError": {
"date": "2022-03-08T07:33:50",
"request-id": "dff19596-b5b2-421d-97d3-8d4b023263f3",
"client-request-id": "32ee2cbd-27f8-2441-e3be-477dbe0cedfa"
}
}
}
解决方法
在调用 API 访问跨租户共享频道之前,请从 URL 中删除 /tenants/{tenant-id} 相应部分。
按角色筛选团队成员的请求需要参数
按角色筛选团队成员的所有请求都需要请求中的 skipToken 参数或 top 参数,但不能同时使用这两个参数。 如果两个参数都在请求中传递,则将忽略 top 参数。
无法按角色筛选团队成员
角色查询筛选器以及其他筛选器 GET /teams/team-id/members?$filter=roles/any(r:r eq 'owner') and displayName eq 'dummy' 可能不起作用。 服务可能使用 BAD REQUEST 响应。
Microsoft Teams 客户端上不提供“查看会议详细信息”菜单
对于通过云通信 API 创建的频道会议,Microsoft Teams 客户端不显示“ 查看会议详细信息 ”菜单。
Teams UI 中未显示敏感度标签
有时应用于 Teams 的敏感度标签不会显示在 Teams UI 中,即使可以在基础 SharePoint 网站和管理员中心中清楚地看到。
GET 请求的响应中可能缺少聊天成员的某些属性
在某些情况下,聊天中各个成员的 tenantId/电子邮件/displayName 属性可能不会填充到 OR GET /chats/chat-id/members/membership-id 请求中GET /chats/chat-id/members。
为展开成员更新聊天限制
此 API 在一个或多个国家/地区云中的工作方式有所不同。 具体请参见 各国云的实现差异。 包含后 $expand=members ,此 API 最多返回 25 个项目,即使指定了更大的 $top 值也是如此。
列出所有频道时返回 null 的 layoutType 属性
列出所有通道时返回 nulllayoutType 属性。 若要获取特定频道的布局类型,请使用 获取频道 API。
用户
导出联机会议项目的 API 可能返回不包含任何内容的脚本 URL
对于某些没有任何转录字词的会议, getAllTranscripts API 可能会返回转录内容 URL。 调用这些会议的内容 URL 将返回错误。
解决方法
验证会议是否已转录以及是否有有效内容。 如果有,请报告以供进一步调查。 否则,忽略内容 URL。
showInAddressList 属性与 Microsoft Exchange 不同步
通过 Microsoft Graph 查询用户时, showInAddressList 属性可能并不指示 Microsoft Exchange 中显示的相同状态。 建议通过 Microsoft 365 管理中心直接使用 Microsoft Exchange 管理此功能,而不是在 Microsoft Graph 中使用此属性。
对用户的个人资料照片的访问受限
只有当用户有邮箱时,才能读取和更新用户的个人资料照片。 在这种情况下,无法读取或更新照片会导致以下错误:
{
"error": {
"code": "ErrorNonExistentMailbox",
"message": "The SMTP address has no mailbox associated with it."
}
}
以前可能使用 thumbnailPhoto 属性存储 (使用当前处于停用周期的 Azure AD 图形 API () 或通过 AD Connect 同步) 存储的任何照片都无法再通过用户资源的 Microsoft Graph 照片属性访问。
目前,Azure AD B2C 租户不支持通过 Microsoft 图形 API 的 profilePhoto 资源管理用户的照片。