#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
(хотя и погибнуть) для выполнения первого запуска.