You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell调用Microsoft Graph API创建Teams会议遇400错误求排查

调用Microsoft Graph API创建Teams会议时出现400错误请求的问题

问题说明

编写PowerShell脚本调用Microsoft Graph API生成Teams会议链接时,触发以下错误:

"Invoke-RestMethod : 远程服务器返回错误: (400) 错误请求"

涉及脚本

$tokenEndpoint = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$body = @{
    client_id     = $clientId
    client_secret = $clientSecret
    scope         = "https://graph.microsoft.com/.default"
    grant_type    = "client_credentials"
}
$accessTokenResponse = Invoke-RestMethod -Uri $tokenEndpoint -Method POST -Body $body
$accessToken = $accessTokenResponse.access_token
$graphEndpoint = "https://graph.microsoft.com/v1.0/users/$userid/onlineMeetings"
$params = @{
    startDateTime = [System.DateTime]::Parse("2023-07-01T14:30:34.2444915-07:00")
    endDateTime = [System.DateTime]::Parse("2023-07-01T15:00:34.2464912-07:00")
    subject = "User Token Meeting"
    "Content-Type" = "application/json"
}
$headers = @{
    Authorization = "Bearer $accessToken"
    "Content-Type" = "application/json"
}
$newMeetingResponse = Invoke-RestMethod -Uri $graphEndpoint -Method POST -Headers $headers -Body $params
$joinUrl = $newMeetingResponse.onlineMeeting.joinUrl
Write-Host "Enlace de la reunión: $joinUrl"

问题根源与修复方案

脚本存在3个核心问题导致400错误:

  • 请求体未序列化:直接传入哈希表$params给Invoke-RestMethod的-Body参数,不会自动转换为Graph API要求的JSON格式,必须先通过ConvertTo-Json处理。同时$params中多余的"Content-Type"键需移除,该配置仅需在请求头中声明。
  • 日期格式传递错误:虽然用[System.DateTime]::Parse转换了时间,但Graph API要求直接传入ISO 8601格式的字符串,DateTime对象序列化后可能不符合接口要求。
  • 响应字段路径错误:创建会议返回的响应中,joinUrl直接位于根对象下,无需通过onlineMeeting层级访问。

修复后的脚本

$tokenEndpoint = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$body = @{
    client_id     = $clientId
    client_secret = $clientSecret
    scope         = "https://graph.microsoft.com/.default"
    grant_type    = "client_credentials"
}
$accessTokenResponse = Invoke-RestMethod -Uri $tokenEndpoint -Method POST -Body $body
$accessToken = $accessTokenResponse.access_token

$graphEndpoint = "https://graph.microsoft.com/v1.0/users/$userid/onlineMeetings"
# 移除多余的Content-Type,直接使用ISO 8601格式的时间字符串
$params = @{
    startDateTime = "2023-07-01T14:30:34.2444915-07:00"
    endDateTime = "2023-07-01T15:00:34.2464912-07:00"
    subject = "User Token Meeting"
}
# 将哈希表序列化为JSON格式
$jsonBody = $params | ConvertTo-Json

$headers = @{
    Authorization = "Bearer $accessToken"
    "Content-Type" = "application/json"
}
$newMeetingResponse = Invoke-RestMethod -Uri $graphEndpoint -Method POST -Headers $headers -Body $jsonBody
# 修正joinUrl的访问路径
$joinUrl = $newMeetingResponse.joinUrl
Write-Host "会议链接: $joinUrl"

额外注意事项

  • 确认Azure AD应用已配置OnlineMeetings.ReadWrite.All应用权限,并完成管理员授权。
  • 确保$tenantId、$clientId、$clientSecret、$userid变量已正确赋值,无拼写错误。

内容的提问来源于stack exchange,提问作者Raul Iturbe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:28:23