PowerShell调用Graph API V1.0获取O365激活报告时Invoke-WebRequest报错
常见报错原因与修复方案
TLS 版本不兼容
旧版 Windows PowerShell 默认仅启用 TLS 1.0/1.1 协议,而 Microsoft Graph API 已强制要求 TLS 1.2 及以上版本,不满足版本要求的请求会直接触发底层连接中断,返回「基础连接已关闭」的错误,该报错不会进入接口权限校验环节。
修复方式为在脚本最开头添加代码强制启用 TLS 1.2:[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12请求头配置冗余
你在请求头中额外添加了Content-type: application/json声明,对于GET请求和CSV流式返回的报告接口来说,该头信息无实际作用,部分场景下会触发服务端的请求校验异常。
修复方式为获取token后,请求头仅保留Authorization字段即可。应用权限配置缺失
使用 client_credentials 模式调用报告接口时,需要给对应Azure AD应用授予应用类型的Reports.Read.All权限,且必须完成全局管理员同意操作。如果权限未授权或未完成同意,部分场景下Graph API不会返回标准403错误,而是直接中断连接,和当前报错表现一致。请求头传递逻辑隐患
你通过管道筛选全局对象的方式获取请求头,如果租户ID拼写不匹配、全局对象作用域异常,会导致传入空的请求头,直接触发连接中断。
修复方式为获取请求头后先做非空校验,确认有效后再发起请求。
修复后可正常运行的脚本示例
# 强制启用TLS 1.2,解决底层连接报错 [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12 function getToken() { param() $global:appreg = @() $global:appreg +=[pscustomobject]@{tenantId="****";appID="****";secret="****";headers=""} $global:appreg | ForEach-Object { $appreg = $_ $ReqTokenBody = @{ Grant_Type = "client_credentials" Scope = "https://graph.microsoft.com/.default" client_Id = $appreg.appID Client_Secret = $appreg.secret } $TokenResponse = iwr -Uri "https://login.microsoftonline.com/$($appreg.tenantId)/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody $accesstoken = ($TokenResponse | ConvertFrom-Json).access_token # 移除冗余的Content-Type请求头 $appreg.headers = @{'Authorization' = 'Bearer ' + $accesstoken} } } $mainTenandID = "****" $reportUri = "https://graph.microsoft.com/v1.0/reports/getOffice365ActivationsUserDetail" getToken # 校验请求头有效性 $targetHeaders = ($global:appreg | Where-Object {$_.tenantID -eq $mainTenandID}).headers if (-not $targetHeaders) { throw "未匹配到对应租户的有效请求头,请检查租户ID配置" } # 发起报告请求,返回内容为CSV格式 $reportResponse = iwr -Uri $reportUri -Method Get -Headers $targetHeaders # 导出为本地CSV文件 $reportResponse.Content | Out-File -FilePath "O365ActivationsUserDetail.csv" -Encoding UTF8
原报错信息:Invoke-RestMethod:基础连接已关闭:发送时出现意外错误。
内容的提问来源于stack exchange,提问作者ld420

