Ответ 1
Попробуйте выполнить запись напрямую, например:
$formFields = @{username='john doe';password='123'}
Invoke-WebRequest -Uri $myUrl -Method Post -Body $formFields -ContentType "application/x-www-form-urlencoded"
Так как я обновился до 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.
РЕДАКТИРОВАТЬ: Благодаря хаммару за капитализацию. Где мои манеры?;)
Попробуйте выполнить запись напрямую, например:
$formFields = @{username='john doe';password='123'}
Invoke-WebRequest -Uri $myUrl -Method Post -Body $formFields -ContentType "application/x-www-form-urlencoded"
Чтобы устранить проблему с неподписанным/ненадежным сертификатом, добавьте строку
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
перед оператором Invoke-WebRequest
Пример в вопросе работает, но вы должны использовать 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