Phil Strahl
Phil Strahl

Reputation: 177

PowerShell v3 Invoke-WebRequest: Troubles with forms

Since I upgraded to Windows 8 a lot of my PowerShell scripts relying on launching an invisible IE won’t quite work anymore, so I tried switching to the Invoke-WebRequest command. I did a lot of googling but still can’t get my script to work.

This is what it should do:

  1. load up a website with a simple form (username, password, submit-button),
  2. enter the credentials
  3. and submit them.

The Microsoft tech-net examples were not very helpful for me, that is what I pieced together:

$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

I receive two errors, the first one when trying to write into the user field:

Cannot index into a null array.

$form.Fields["user"]     = "username"

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

The second one has to do with the $form.Action which I have no idea what it should read:

Invoke-WebRequest : Cannot validate argument on parameter 'Uri'. The argument is  null or empty. Supply an argument that is not null or empty and then try the command  again.

Again, I relied heavily on example #2 at Microsoft.

Upvotes: 16

Views: 33404

Answers (4)

Adam Cox
Adam Cox

Reputation: 3661

If you're me and have been troubleshooting a bad Web Request, in my case a -Body that was becoming null at my API, then you will want to know about the gotcha that is about interleaving your line continuations with comments. This

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

Notice the commented out line # -contenttype 'application/x-www-form-urlencoded' # default

Putting a comment truncates the remaining back-ticked line continuation. Therefore, in my case my web request ended up with a request having 0-byte payload.

Upvotes: 0

csmacnz
csmacnz

Reputation: 351

The example in the question works, but you have to use rb and not $rb in the first line:

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

I also had to use ($myUrl + '/login') since this is my login address.

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

And in the last line used ($myUrl + $form.Action):

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

Upvotes: 3

Jaxon Pickett
Jaxon Pickett

Reputation: 71

To address your problem with the unsigned/untrusted certificate, add the line

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

before the Invoke-WebRequest statement

Upvotes: 7

Keith Hill
Keith Hill

Reputation: 201602

Try doing the post directly e.g.:

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

Upvotes: 16

Related Questions