1

我正在尝试使用 Powershell 中的“Invoke-WebRequest”调用 Web 应用程序 url,当我调用“internal.com”url 时,它被重定向到另一个网页,其 url 为“.../xyz.aspx”,仅接受电子邮件作为输入并获得身份验证。

我正在使用以下代码(如 Thomas 所建议的那样)并尝试了不同的排列和组合。

$firstRequest = Invoke-WebRequest -Uri 'https://XYZ.internal.com/' -SessionVariable mySession
$firstRequest.Forms[0].Fields["$txtEMAIL"] = "xyz@xyz.com"
$response = Invoke-WebRequest -Uri $firstRequest.BaseResponse.ResponseUri.AbsoluteUri -Body $firstRequest -WebSession $mySession

运行上述代码时,我收到以下消息。

Invoke-WebRequest : Cannot send a content-body with this verb-type.
At line:9 char:18
+ ... ndRequest = Invoke-WebRequest -Uri ($baseUri + $firstRequest.Forms[0] ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [Invoke-WebRequest], ProtocolViolationException
+ FullyQualifiedErrorId : System.Net.ProtocolViolationException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

谢谢你。

4

1 回答 1

2

正如您在代码中看到的,您的第二个请求与您的第一个请求完全无关。您必须改用一个会话。而且您不应依赖您认为会出现的“下一个”URI,而应使用表单将调用的 URI:

# Do your first request to obtain the login form and start maintaining one session
$baseUri = 'https://XYZ.internal.com'
$firstRequest = Invoke-WebRequest -Uri $baseUri -SessionVariable mySession

# Fill out your login form
$firstRequest.Forms[0].Fields["$txtEMAIL"] = "xyz@xyz.com"

# Use the URI defined in the action of your form to send your request to while maintaining your session
$secondRequest = Invoke-WebRequest -Uri ($baseUri + $firstRequest.Forms[0].Action) -Body $firstRequest -WebSession $mySession

请注意,您在SessionVariable没有 a的情况下定义了 your $,但稍后将其与 a 一起使用$

如果您的第二个请求尚未返回您想要的网站,请相应地重复第二个请求的步骤(使用$secondRequest创建的表单/正文$thirdRequest等)。

于 2020-06-23T05:50:33.820 回答