PowerShell v3 Invoke-WebRequest:与表单混淆

时间:2012-12-05 17:55:29

标签: forms powershell web webrequest

自从我升级到Windows 8后,很多依赖于启动隐形IE的PowerShell脚本将不再适用,所以我尝试切换到 Invoke-WebRequest 命令。我做了很多谷歌搜索,但仍然无法让我的脚本工作。

这是它应该做的:

  1. 使用简单表单(用户名,密码,提交按钮)
  2. 加载网站
  3. 输入凭据
  4. 并提交。
  5. 借助微软技术网例子的“帮助”(至少对我而言),我将以下内容拼凑在一起:

    $myUrl = "http://some.url"  
    
    $response = Invoke-WebRequest -Uri $myUrl -Method Default -SessionVariable $rb
    $form = $response.Forms[0]
    $form.Fields["user"]     = "username"
    $form.Fields["password"] = "password"
    
    $response = Invoke-WebRequest -Uri $form.Action -WebSession $rb -Method POST 
    $response.StatusDescriptionOK
    

    我收到两个错误,第一个是在尝试写入“user”字段时:

      

    无法索引到空数组。

         

    $ form.Fields [“user”] =“username”

    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
    

    第二个与$form.Action有关,我不知道应该读什么:

      

    Invoke-WebRequest:无法验证参数'Uri'的参数。争论是   null或空。提供非null或空的参数,然后尝试该命令   试。

    同样,我非常依赖example #2 at Microsoft

    编辑:感谢hammar的资本化。我的举止在哪里? ;)

4 个答案:

答案 0 :(得分:13)

直接尝试发帖,例如:

$formFields = @{username='john doe';password='123'}
Invoke-WebRequest -Uri $myUrl -Method Post -Body $formFields -ContentType "application/x-www-form-urlencoded"

答案 1 :(得分:7)

要使用未签名/不受信任的证书解决您的问题,请添加行

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
在Invoke-WebRequest语句之前

答案 2 :(得分:2)

问题中的示例有效,但您必须在第一行使用rb而不是$rb

$response = Invoke-WebRequest -Uri $myUrl -Method Default -SessionVariable rb

我还必须使用($myUrl + '/login'),因为这是我的登录地址。

$ response = Invoke-WebRequest -Uri($ myUrl +' / login')-Method Default -SessionVariable rb

在最后一行使用($myUrl + $form.Action)

$response = Invoke-WebRequest -Uri ($myUrl + $form.Action) -WebSession $rb -Method POST

答案 3 :(得分:0)

如果您是我,并且一直在解决错误的Web请求(在我的情况下,一个-Body在我的API上已成为null),那么您将想知道有关使行的延续与注释交织在一起。这个

$r = iwr -uri $url `
    -method 'POST' `
    -headers $headers `
    # -contenttype 'application/x-www-form-urlencoded' ` # default
    -Body $body

请注意已注释掉的行# -contenttype 'application/x-www-form-urlencoded' # default

放置注释会截断其余的反引号继续。因此,在我的情况下,我的Web请求最终以有效载荷为0字节的请求结束。