PowerShell v3 Invoke-WebRequest: проблемы с формами

Так как я обновился до Windows 8, многие мои сценарии PowerShell, основанные на запуске невидимого IE, уже не работают, поэтому я попытался переключиться на команду Invoke-WebRequest. Я много сделал для googling, но все еще не могу заставить работать script.

Это то, что он должен делать:

  • загрузите веб-сайт с помощью простой формы (имя пользователя, пароль, кнопка отправки),
  • введите учетные данные
  • и отправьте их.

С помощью "помощи" невероятно плохих примеров технологий Microsoft (по крайней мере для меня) я собрал следующее вместе:

$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

Я получаю две ошибки, первая при попытке записать в поле "пользователь":

Невозможно индексировать нулевой массив.

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

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

Второй имеет отношение к $form.Action, который я понятия не имею, что он должен читать:

Invoke-WebRequest: не удается проверить аргумент в параметре "Uri". Аргументом является пустой или пустой. Поставьте аргумент, который не является нулевым или пустым, а затем попробуйте команду еще раз.

Снова я сильно полагался на пример № 2 в Microsoft.

РЕДАКТИРОВАТЬ: Благодаря хаммару за капитализацию. Где мои манеры?;)

Ответ 1

Попробуйте выполнить запись напрямую, например:

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

Ответ 2

Чтобы устранить проблему с неподписанным/ненадежным сертификатом, добавьте строку

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

перед оператором Invoke-WebRequest

Ответ 3

Пример в вопросе работает, но вы должны использовать 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