Invoke-RestMethod调用MS Graph时UTF-8编码失效问题
解决Microsoft Graph API邮件活动报告的PowerShell乱码问题
出现İç test01 Bölge)这类乱码,本质是UTF-8编码的响应被PowerShell错误地用Windows-1252/ISO-8859-1解码了。Invoke-RestMethod会自动推断响应编码,遇到带BOM的UTF-8内容时容易识别错误,导致乱码。
直接用以下方案修复:
改用Invoke-WebRequest获取原始响应并手动解码UTF-8
放弃Invoke-RestMethod,用Invoke-WebRequest拿到原始字节流,再用UTF-8编码解码,从根源解决编码不匹配问题:
$appid = 'APPID' $tenantid = 'TENANTID' $secret = 'SECRETID' $body = @{ Grant_Type = "client_credentials" Scope = "https://graph.microsoft.com/.default" Client_Id = $appid Client_Secret = $secret } $ConnectionParameters=@{ Uri="https://login.microsoftonline.com/$tenantid/oauth2/v2.0/token" Method ="POST" Body = $body } $connection = Invoke-RestMethod @ConnectionParameters $token = $connection.access_token # Connect-MgGraph可按需保留,获取报告不强制依赖该连接 # Connect-MgGraph -AccessToken $token $headers = @{"Authorization" = "Bearer "+ $token} $uri = "https://graph.microsoft.com/v1.0/reports/getEmailActivityUserDetail(period='D7')" # 核心修复:获取原始响应字节流,手动用UTF-8解码 $response = Invoke-WebRequest -Uri $uri -Headers $headers $usermailactivitydetail = [System.Text.Encoding]::UTF8.GetString($response.Content) # 移除UTF-8 BOM(如果存在),再转换为CSV对象 $result = $usermailactivitydetail -replace '^\uFEFF', '' $resultarray = ConvertFrom-Csv -InputObject $result # 导出CSV时指定UTF-8编码,避免二次乱码 $resultarray | Export-Csv "C:\output.csv" -NoTypeInformation -Encoding UTF8
为什么之前的方法无效?
你之前替换Report Refresh Date的操作只是移除了BOM的字符表现,但Invoke-RestMethod已经把整个响应内容用错误的编码解码成了字符串,乱码已经产生,后续替换无法逆转编码错误。必须在获取响应的阶段就用正确的编码解码原始字节流。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

