如何解决Powershell:捕获 WebRequest Respose 与本机响应不同
我在从 catch 块内的异常中获取相同的数据时遇到了一个小问题,而我却没有。
在没有 try/catch 块的情况下调用 Microsoft Defenders ATP API 会呈现以下错误消息:
Invoke-WebRequest : {"error":{"code":"ActiveRequestAlreadyExists","message":"Action is already in progress","target":"{security string redaction}"}}
At line:35 char:27
+ ... ardAction = Invoke-WebRequest -Uri $Offboarduri -Headers $Headers -Me ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest],WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
但是,当在 catch 块中时,不可能捕获该消息中任何有用的附加信息(特别是 {code":"ActiveRequestAlreadyExists","message":"Action is already in progress" } 部分)
我已将以下内容放入我的捕获中以尝试询问反馈,但没有与该数据相关的内容:
Write-Host "Exception Defaults"
$_.Exception | Select *
Write-Host "Exception Response Sub Text"
$_.Exception.Response | Select *
这些给了我非常笼统的回答:
Exception Defaults
Status : ProtocolError
Response : System.Net.HttpWebResponse
Message : The Remote Server returned an error: (400) Bad Request.
Data : {}
InnerException :
TargetSite : System.Net.WebResponse GetResponse(System.Net.WebRequest)
StackTrace : at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.GetResponse(WebRequest request)
at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.ProcessRecord()
HelpLink :
Source : Microsoft.PowerShell.Commands.Utility
HResult : -2146233079
Exception Response Sub Text
IsMutuallyAuthenticated : False
Cookies : {}
Headers : {x-content-type-options,x-request-id,OData-Version,Strict-Transport-Security...}
SupportsHeaders : True
ContentLength : 137
ContentEncoding :
ContentType : application/json; odata.Metadata=minimal
CharacterSet :
Server : Microsoft-HTTPAPI/2.0
LastModified : 04/03/2021 18:31:13
StatusCode : BadRequest
StatusDescription : Bad Request
ProtocolVersion : 1.1
ResponseUri : https://api.securitycenter.windows.com/api/machines/{security string redaction}/offboard
Method : POST
IsFromCache : False
有谁知道我们可以捕获原始文本以从错误中获得比“错误请求”更具建设性的反馈的方法,以便更明显地表明该请求是错误的,因为它之前已经有一个请求进行中。
谢谢
解决方法
读取响应(可能已经被读取):
# obtain stream
$stream = $_.Exception.Response.GetResponseStream()
try {
# rewind stream cursor
[void]$stream.Seek(0,'Begin')
# read entire response body
$reader = [System.IO.StreamReader]::new($stream)
$body = $reader.ReadToEnd()
# return or parse/inspect $body here ...
}
finally {
# clean up
if($reader -is [System.IO.StreamReader]){
$reader.Dispose()
}
$stream.Dispose()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。