如何在PowerShell中使用NTLM认证发起带请求体的POST请求?
在PowerShell中使用NTLM认证发起带请求体的POST请求
针对你遇到的POST请求用-UseDefaultCredentials返回401未授权的问题,核心原因是NTLM认证是挑战-响应式的协议,没法像Basic认证那样手动构造Authorization头,必须让PowerShell自动处理认证流程。下面给你两种可行的解决方案:
方案1:使用当前用户凭据(对应-UseDefaultCredentials场景)
如果目标服务器允许当前登录用户的NTLM凭据访问,只需要在Invoke-WebRequest中明确指定认证类型为NTLM即可——之前POST请求失败大概率是因为PowerShell自动协商认证时没有正确触发NTLM流程:
$myURL = "https://example.blah.etc" $params = @" {"EXAMPLE1":"STUFF"} "@ Invoke-WebRequest -Uri $myURL ` -Method POST ` -ContentType "application/json" ` -Body $params ` -UseDefaultCredentials ` -Authentication NTLM | Select-Object -ExpandProperty Content > "C:\output.json"
关键是加上-Authentication NTLM参数,强制PowerShell走NTLM认证流程,这样就能正确处理POST请求的授权逻辑了。
方案2:指定特定用户凭据
如果需要用非当前用户的账号发起请求,可以先创建PSCredential对象,再配合-Credential和-Authentication NTLM参数:
$myURL = "https://example.blah.etc" $params = @" {"EXAMPLE1":"STUFF"} "@ # 构建凭据对象(用户名需包含域名,格式为domain\username或username@domain.com) $username = "yourdomain\yourusername" $password = ConvertTo-SecureString "yourpassword" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $password) Invoke-WebRequest -Uri $myURL ` -Method POST ` -ContentType "application/json" ` -Body $params ` -Credential $credential ` -Authentication NTLM | Select-Object -ExpandProperty Content > "C:\output.json"
为什么之前的Basic认证头无效?
NTLM认证不是一次性的凭证传递,而是服务器先返回401挑战、客户端再生成响应的交互过程。手动构造Authorization: Basic ...头只适用于Basic认证,完全无法触发NTLM的挑战-响应流程,所以POST请求会被服务器拒绝。
内容的提问来源于stack exchange,提问作者Murchie85
相关产品推荐
相关产品推荐

