UseBasicParsing не возвращает HTML-форму

#powershell

#powershell

Вопрос:

Я работаю над созданием монитора входа в форму для веб-страницы. Вот код:

 $loginbase = '<input omitted>'
$loginURL = $loginbase   '<input omitted>'
$r = Invoke-WebRequest -Uri ($loginURL   'logonform.jsp')
return $r;

$form = $r.Forms[0];

return $form

$form.Fields['aps'] = '<input omitted>';
$form.Fields['usr'] = '<input omitted>';
$form.Fields['pwd'] = '<input omitted>';

$r = Invoke-WebRequest -Uri ($loginURL   $form.Action) -Method POST -Body $form.Fields;

if ($r.Content -match 'setup()') {

    if ($r.StatusCode -eq 200) {

        Write-Host 'Message:' $r.StatusDescription;
        Write-Host 'Statistic:' $r.StatusCode;
        Exit 0;
    }

    Write-Host 'Message:' $r.StatusDescription;
    Write-Host 'Statistic:' $r.StatusCode;
    Exit 1;
}

Write-Host 'Message: Did not login';
Write-Host 'Statistic: 1';
Exit 1;
  

Это отлично работает вне платформы мониторинга, но когда я помещаю этот скрипт в платформу, я получаю следующую ошибку:

 Invoke-WebRequest : The response content cannot be parsed because the Internet Explorer engine is not available, or Internet Explorer's first-launch configuration is not complete. Specify the UseBasicParsing parameter and try again. 
At line:3 char:6 
  $r = Invoke-WebRequest -Uri ($loginURL   'logonform.jsp') 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  CategoryInfo : NotImplemented: (:) [Invoke-WebRequest], NotSupportedException 
  FullyQualifiedErrorId : WebCmdletIEDomNotSupportedException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand 

Cannot index into a null array. 
At line:5 char:1 
  $form = $r.Forms[0]; 
  ~~~~~~~~~~~~~~~~~~~ 
  CategoryInfo : InvalidOperation: (:) [], RuntimeException 
  FullyQualifiedErrorId : NullArray 

Cannot index into a null array. 
At line:7 char:1 
  $form.Fields['aps'] = '<input omitted>'; 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  CategoryInfo : InvalidOperation: (:) [], RuntimeException 
  FullyQualifiedErrorId : NullArray 

Cannot index into a null array. 
At line:8 char:1 
  $form.Fields['usr'] = '<input omitted>'; 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  CategoryInfo : InvalidOperation: (:) [], RuntimeException 
  FullyQualifiedErrorId : NullArray 

Cannot index into a null array. 
At line:9 char:1 
  $form.Fields['pwd'] = '<input omitted>'; 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  CategoryInfo : InvalidOperation: (:) [], RuntimeException 
  FullyQualifiedErrorId : NullArray 

Invoke-WebRequest : The remote server returned an error: (404) Not Found. 
At line:11 char:6 
  $r = Invoke-WebRequest -Uri ($loginURL   $form.Action) -Method POST -Body $form. ... 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException 
  FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
  

Следуя предложению первой ошибки, я добавил ‘-UseBasicParsing’ в свой первоначальный оператор Invoke-WebRequest. Когда я запускаю скрипт либо внутри, либо за пределами платформы мониторинга, происходит то, что ни одна из форм или входных полей не извлекается из HTML. Я получаю следующее:

 StatusCode        : 200
StatusDescription : OK
Content           : <!--
                    ©2010 - 2013 SAP AG or an SAP affiliate company.  All rights reserved.

                    SAP and other SAP products and services mentioned herein as well as their respective logos are trademarks or registered...
RawContent        : HTTP/1.1 200 OK
                    Content-Length: 2561
                    Content-Type: text/html;charset=utf-8
                    Date: Tue, 11 Oct 2016 15:31:12 GMT
                    Expires: 0
                    Set-Cookie: JSESSIONID=DE3280200E764687D90E63E50A65452F; Path=/AdminTools...
Forms             : 
Headers           : {[Content-Length, 2561], [Content-Type, text/html;charset=utf-8], [Date, Tue, 11 Oct 2016 15:31:12 GMT], [Expires, 0]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : 
RawContentLength  : 2561
  

Я пытался найти альтернативное решение как в Google, так и на форумах поддержки нашей платформы мониторинга, но ни одно из них не вышло за рамки стандартных руководств по использованию Invoke-WebRequest .

Комментарии:

1. Если вы можете использовать внешнюю библиотеку, используйте HtmlAgilityPack .

2. @wOxxOm Я большой поклонник HtmlAgilityPack, но его использование (или любой другой способ синтаксического анализа) потребует дополнительного кода для получения типов строк или объектов, необходимых для передачи обратно iwr для входа в форму; это было бы далеко от замены того, как легко iwr сделать это изначально. Реквизит, если вы хотите добавить этот ответ 🙂

Ответ №1:

Функция, которую вы пытаетесь использовать, которая представляет собой HTML, преобразованный в объектную модель, требует, чтобы Internet Explorer был доступен и инициализирован. -UseBasicParsing в частности, он не выполняет этот синтаксический анализ для ситуации, когда вам это не нужно, и где IE недоступен (например, на Server Core).

Если вы не используете server core, а IE действительно доступен, то проблема, скорее всего, заключается в следующем:

Настройка Internet Explorer при первом запуске не завершена.

В этом случае просто запустите IE в первый раз, и это должно исправить.

Если скрипт запускается от имени учетной записи службы, убедитесь, что вы один раз вошли в систему с этой учетной записью и инициализировали IE (для каждого пользователя).

Комментарии:

1. Хм, я не подумал об этом, поэтому я убедился, что конфигурация первого запуска IE была завершена (ее не было) для учетной записи службы. Я все еще получаю сообщение об ошибке, но я собираюсь вернуться на форумы поддержки продукта и посмотреть, что они скажут.

2. @Resin Я также нашел эту страницу , которая использует групповую политику для отключения первого запуска. Это может работать лучше. Я также смутно припоминаю ошибку, из-за которой в некоторых случаях ошибка оставалась после первого запуска конфигурации, но я не могу найти никаких ссылок на это прямо сейчас. Я также добавляю, что вы должны полностью закрыть и повторно открыть powershell после первого запуска IE, прежде чем пытаться iwr снова.

3. Поэтому я хотел вернуться и сообщить всем, каким было решение, на случай, если какая-нибудь бедная душа закончит чтение этой темы для решения. Решение для мониторинга запускает свои службы как локальную систему. Поэтому мне пришлось внести изменения в реестр в IE, чтобы «Запретить запуск мастера первого запуска» в разделе Конфигурация компьютера> Административные шаблоны> Компоненты Windows> Internet Explorer. Мне пришлось установить для этого значение включено, а затем выбрать один из вариантов (я выбрал второй вариант).

4. Это именно то, что вы опубликовали

5. @Resin Я думаю, что отключение мастера первого запуска было правильным решением (будь то с помощью реестра или групповой политики), но с psexec.exe помощью (из SysInternals, не связанных с PowerShell) вы могли бы запустить IE как SYSTEM (хотя и погибнуть) для выполнения первого запуска.