使用NTLM进行POST的Powershell调用WebRequest

13

最初问题

如何在Powershell中使用Invoke-WebRequest或类似命令,以便使用NTLM身份验证并提供用于POST的正文。

示例

下面是我的示例代码,使用Invoke-WebRequest进行POST请求,并将响应传输到.json文件。用户名和密码变量未包含在示例中。

$myURL = https://example.blah.etc
$params = @" {""EXAMPLE1":"STUFF"} "@ 

$Headers = @{ Authorization = "Basic {0}" -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $Username,$Password))) }


Invoke-WebRequest -Uri $myURL  -Headers $Headers -Method POST -ContentType "application/json" -Body  $params  | Select-Object -ExpandProperty Content > "C:\output.json"

更新

-UseDefaultCredentials 只适用于获取,不适用于发布。



错误响应

远程服务器返回错误:(401) 未经授权。


在 6.0 版本中,有一些改进 Web 请求 cmdlets 的工作已经完成。请查看此处的线程:https://github.com/PowerShell/PowerShell/issues/4274 和此处的文档:https://learn.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Invoke-RestMethod?view=powershell-6 - veefu
2
“Using -UseDefaultCredentials only works for Gets, not for posts.” -- 你可以使用GET执行NTLM身份验证,将会话保存到变量中(使用-SessionVariable),然后使用已保存的会话进行POST。 - n01d
1个回答

16

只需使用-UseDefaultCredentials

尝试操纵NTLM头文件是一项艰苦的工作。这是一个具有挑战性的响应,令人痛苦。让PS来完成这项工作...


那是我尝试的第一件事 - 它在执行 post 时不起作用,只对 get 有效。 - Murchie85
你尝试删除基本身份验证标头了吗?这可能会让服务器感到困惑。 - markgamache

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接