PowerShell 7调用Invoke-RestMethod返回401未授权但5.1运行正常
问题根因
PowerShell 7基于.NET Core/.NET 5+开发,和基于.NET Framework的PowerShell 5.1的HTTP请求处理逻辑存在差异:默认使用的SocketsHttpHandler对非HTTPS请求的Windows集成认证(Negotiate/NTLM)协商逻辑做了限制,收到401质询后不会自动触发后续的认证令牌提交流程,即使加了-AllowUnencryptedAuthentication参数也不会主动响应Negotiate类型的认证质询。
可行解决方案
- 主动指定认证类型
在PowerShell 7的命令中新增-Authentication Negotiate参数,强制命令收到401质询后主动用当前用户的默认凭证生成Negotiate令牌完成认证,修改后命令如下:
Invoke-RestMethod "http://internalServer/api/job?name=testJob" -Method GET -UseDefaultCredentials -ContentType "application/JSON" -AllowUnencryptedAuthentication -Authentication Negotiate
如果服务器仅开启了NTLM认证未开启Negotiate,将参数值替换为Ntlm即可。
- 回退到兼容PowerShell 5.1的HTTP处理程序
如果上述参数不生效,可以在运行请求前先执行以下代码,将PowerShell 7的HTTP处理程序切换为和5.1一致的实现,再执行原请求即可恢复相同的认证行为:
Add-Type @" using System; using System.Net; public class AuthCompatConfig { public static void EnableLegacyHttpHandler() { AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false); ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault; } } "@ [AuthCompatConfig]::EnableLegacyHttpHandler()
内容的提问来源于stack exchange,提问作者JR_M
相关产品推荐
相关产品推荐

