web-dev-qa-db-ja.com

PowerShell v3 Invoke-WebRequest:フォームの問題

Windows 8にアップグレードしたので、非表示のIEの起動に依存するPowerShellスクリプトの多くは機能しなくなったので、Invokeに切り替えてみました-WebRequestコマンド。多くのグーグルを実行しましたが、それでもスクリプトを機能させることができません。

これはそれがすべきことです:

  1. 簡単なフォーム(ユーザー名、パスワード、送信ボタン)を使用してWebサイトをロードします。
  2. 資格情報を入力します
  3. そしてそれらを提出します。

信じられないほど悪いMicrosofttech-netの例(少なくとも私にとっては)の「助け」を借りて、私は次のことをまとめました。

$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

「ユーザー」フィールドに書き込もうとしたときに最初のエラーが発生します。

Null配列にインデックスを付けることはできません。

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

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

2つ目は、$form.Actionと関係がありますが、何を読むべきかわかりません。

Invoke-WebRequest:パラメーター 'Uri'の引数を検証できません。引数がnullまたは空です。 nullまたは空でない引数を指定してから、コマンドを再試行してください。

繰り返しになりますが、私は Microsoftの例2 に大きく依存していました。

編集:大文字化のためのhammarに感謝します。私のマナーはどこにありますか? ;)

14
Phil Strahl

直接投稿してみてください。例:

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

署名されていない/信頼されていない証明書の問題に対処するには、次の行を追加します

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

invoke-WebRequestステートメントの前

7
Jaxon Pickett

質問の例は機能しますが、最初の行で$rbではなくrbを使用する必要があります。

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

これは私のログインアドレスであるため、($myUrl + '/login')も使用する必要がありました。

$ response = Invoke-WebRequest -Uri($ myUrl + '/ login')-メソッドのデフォルト-SessionVariable rb

そして最後の行で使用された($myUrl + $form.Action)

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

あなたが私で、悪い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バイトのペイロードを持つ要求になりました。

0
Adam Cox