PowerShell v3 Invoke-WebRequest: Troubles with forms

Phil Strahl picture Phil Strahl · Dec 5, 2012 · Viewed 26.9k times · Source

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.

With the "help" of the incredibly bad Microsoft tech-net examples (at least for me), I pieced the following 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.

EDIT: Thanks to hammar for the capitalization. Where are my manners? ;)

Answer

Keith Hill picture Keith Hill · Dec 5, 2012

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"