Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как закрыть IE (Kerio NTLM) (http://forum.oszone.net/showthread.php?t=337924)

Charg 27-11-2018 18:37 2842900

Как закрыть IE (Kerio NTLM)
 
Есть такой код
Скрытый текст
Код:

Dim oIE

Set oIE = CreateObject("InternetExplorer.Application")

oIE.Visible = False

oIE.Fullscreen = False

oIE.Toolbar = True

oIE.Statusbar = True

oIE.Navigate("https://kerio.domain.ua:4081/login")

WScript.Sleep(30000)

oIE.quit



Взят отсюда https://manuals.gfi.com/en/kerio/con...ntrol-917.html

По идее что он должен делать - открыть IE, зайти на сайт (таким образом клиент аутентифицируется на веб-статистике керио), подождать 30 секунд, закрыть IE.

Проблема в том что oIE.quit не отрабатывает - IE не закрывается и у юзера бесконечно висит окно эксплорера которое закрывать либо вручную либо запускать батник который стартует vbs-скрипт а потом грохает IE. Но это не вариант потому что проблема "юзер видит мельтешащие и в общем-то не не нужные ему окна" всё еще не решается.
Как-нибудь можно сделать этот процесс невидимым пользователю?

Iska 27-11-2018 21:44 2842944

Charg, у меня — закрылся.

Если вместо .Visible = False использовать .Visible = True — что-нибудь видно при этом симптоматичного, что может мешать завершению работы приложения?

Serguei Kouzmine 27-11-2018 23:23 2842977

по большому не пробовали ?

Код:

# quit and dispose IE
$ie.Quit()
while( ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie) | out-null) ) {}
Remove-Variable ie -ErrorAction SilentlyContinue


Charg 28-11-2018 01:01 2842999

Iska, visible=false, по большому счету, тоже никакого эффекта не имеет, т.к. окно IE в любом случае отображается (хотя возможно я неправильно понимаю суть этого параметра).
В принципе на работе с коллегой заметили странный нюанс - если запускать этот скрипт даблкликом из x32 тотал коммандера - отрабатывает как надо, если просто из эксплорера (x64 уже, win10 ltxb) - не отрабатывает.

Serguei Kouzmine, это PS? А как мне это в vbs скрипт впихнуть? Или наоборот - как впихнуть ту же последовательность действий (открыть браузер, перейти по ссылке, подождать, закрыть браузер) в PS?

Iska 28-11-2018 02:38 2843002

Цитата:

Цитата Charg
Iska, visible=false, по большому счету, тоже никакого эффекта не имеет, т.к. окно IE в любом случае отображается »

Неа. Не отображается.

Цитата:

Цитата Charg
В принципе на работе с коллегой заметили странный нюанс - если запускать этот скрипт даблкликом из x32 тотал коммандера - отрабатывает как надо, если просто из эксплорера (x64 уже, win10 ltxb) - не отрабатывает. »

Когда Вы используете запуск из-под x86-приложения — из-за редиректа файловой системы используется x86-версия wscript.exe/cscript.exe из SysWOW64. Из-за редиректа реестра и все объекты Automation также создаются на базе перенаправленных x86-разделов реестра и x86-версий библиотек.

В принципе, на x64 ОС Вы можете принудительно использовать запуск этого WSH скрипта под потребной разрядности wscript.exe/cscript.exe из каталога %SystemRoot%\SysWOW64, ежели под ними всё отрабатывает как надо.

Charg 28-11-2018 09:29 2843023

В общем выяснил что дело в самой странице, которую получает IE.
так работает потому что страница google.com нормально грузится
Код:

Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.ToolBar = 1
IE.StatusBar = 1
IE.Width = 50
IE.Height = 50
IE.Navigate("https://google.com")
WScript.Sleep(2000)
IE.Quit


а так не работает
Код:

Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.ToolBar = 1
IE.StatusBar = 1
IE.Width = 50
IE.Height = 50
IE.Navigate("https://kerio:4081/login")
WScript.Sleep(2000)
IE.Quit


И выдает ошибку
Скрытый текст

На строке IE.Quit. А не работает потому (наверное) что при попадании юзера на эту страницу его редиректит на https://kerio:4081/login/blocked.php т.к. у юзера нет прав смотреть собственную статистику, та в общем-то и не должно быть.
Собственно, варианта решения два - настроить керио чтоб либо не редиректило либо дать права на статистику - или каким-то образом насильно грохать IE внутри скрипта. Как отключить редирект на керио я, честно говоря, понятия не имею, а выдача пользователю прав на просмотр собственной статистики почему-то не помогает. Так что видимо придется пойти менее правильным путем - скриптом насильно грохать IE.
Из VBS скрипта это можно как-то сделать?

upd.
Оказалось что если открыть страницу https://kerio:4081/login/ в гуглохроме - пользователя нормально редиректит на страницу статистики керио (при условии наличия прав)
Если открыть ту же самую страницу в эксплорере (тот же пользователь и права) - редиректит на https://kerio:4081/login/blocked.php

Iska 28-11-2018 17:55 2843104

Charg, тогда можно смело обращаться в техподдержку Kerio с этим:
Цитата:

Цитата Charg
Оказалось что если открыть страницу https://kerio:4081/login/ в гуглохроме - пользователя нормально редиректит на страницу статистики керио (при условии наличия прав)
Если открыть ту же самую страницу в эксплорере (тот же пользователь и права) - редиректит на https://kerio:4081/login/blocked.php »

вопросом.

megaloman 28-11-2018 22:08 2843145

Charg, Если хамским образом закрыть все экземпляры эксплорера, то после oIE.quit
Код:

Program = "iexplore.exe"

Set WMI = GetObject("winMgmts:")
SQuery = "Select *From Win32_Process Where Name=" + """" + Program + """"

Set Processes = WMI.ExecQuery(SQuery)
For Each Process In Processes
    Process.Terminate
Next


Serguei Kouzmine 29-11-2018 07:45 2843190

@Charg у меня постепенно наполняется примерами github даже не репо а директория в другом репо - internetExplorer automation может пригодится когда *ставить вообще ничего нельзя* но это весьма трудоемкое скриптоделание очень уж он парши ^W нехороший инструмент - вот линк
https://github.com/sergueik/powershe...er_application

Charg 29-11-2018 09:26 2843201

megaloman, работает, закрывается. Остается только каким-то образом "спрятать" само окно эксплорера, которое появляется на секунду. oIE.Visible = False не отрабатывает.

Serguei Kouzmine, переписал на PS, получилось так:
Скрытый текст
Код:

$ie = new-object -com 'internetexplorer.application'
$ie.visible = $false
$ie.ToolBar = 0
$ie.StatusBar = 0
$ie.Width = 1
$ie.Height = 1
$url = 'https://kerio:4081/login'
$ie.navigate2($url)
$ie.Quit()
while( ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie) | out-null) ) {}
Remove-Variable ie -ErrorAction SilentlyContinue


В итоге IE открывается, переходит куда надо (всё это не в "скрытом" режиме, как должно было бы быть, ведь есть $ie.visible = $false), а потом не закрывается.

Iska 29-11-2018 19:42 2843311

Charg, вообще окно IE по умолчанию не должно отображаться. Я не знаю, может быть в новых ОС это поведение как-то изменилось?! На другой машине не пробовали поиграться с этим кодом?

Ну, и вместо простого Sleep'а лучше пользовать примерно такую конструкцию:
Код:

    .Navigate "bla-bla-bla"
   
    ' Ждём…
    Do
        WScript.Sleep 100
    Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE

И, возможно, её, через малую паузу, ещё придётся повторить, потому как редирект выполняется.

Serguei Kouzmine 30-11-2018 03:04 2843371

@charg забудьте про ie и перейдите на Headless Chrome и здоровье сбережете
он работает с chome 70/ chromedriver 44 (на самом деле даже раньше на правильных OS

)
https://developers.google.com/web/up...eadless-chrome
- не идеально но с Вашей справится... не знаете как смотрете мойрепо
https://github.com/sergueik/powershell_selenium

кстати не забывайте пожалуйста: like it? star it!

Iska 30-11-2018 06:16 2843376

Serguei Kouzmine, а что, Google Chrome уже научился в Automation?

Serguei Kouzmine 30-11-2018 06:49 2843378

представьте
selenium https://www.joecolantonio.com/seleni...visual-studio/

- то же самое из повершелл
https://github.com/sergueik/powershell_selenium
или Chrome Devtools kit
https://github.com/BaristaLabs/chrom...ools-generator
- это поэкзотичнее и новое
я личнно CDP дела л из праведной Java но на самом деле npm его всё.

гуглите powershell selenium и 100500 ссылок

VBS Selenim тоже существует но это нишевой продук экзотика

Charg 30-11-2018 11:35 2843402

Цитата:

Цитата Iska
Charg, вообще окно IE по умолчанию не должно отображаться. Я не знаю, может быть в новых ОС это поведение как-то изменилось?! На другой машине не пробовали поиграться с этим кодом? »

Ну, не знаю, у меня в конторе все компы раскатаны из одного образа, и тестил поведение я на таком же компе, соответственно и добиться результата я хочу именно на нем же.
Я конечно не исключаю что где-то чего-то может быть напортачено в образе, но сравнить поведение я могу разве что с серверными ОС. Есть 2019 и 2016 сервера - на обоих поведение то же самое (установлены с образов msdn).
Цитата:

Цитата Serguei Kouzmine
@charg забудьте про ie и перейдите на Headless Chrome и здоровье сбережете »

Видел и читал, но оно не работает так как надо - создает тьму процессов chrome.exe, авторизация на керио не отрабатывает (и хрен знает как проверить пошел ли этот браузер по указанному адресу или нет), если запускать батником то окно командной строки бесконечно висит. Ну и вообще по содержимому статьи похоже что этот гайдик на линукс расчитан, возможно виндовые версии хрома не особенно умеют в этот headless режим? Хром, если что, последней версии, 32-битный, запускался батником который лежит рядом с chrome.exe, содержимое:
Код:

chrome.exe --headless --disable-gpu --remote-debugging-port=9222 https://kerio:4081/login

Iska 30-11-2018 17:39 2843454

Charg, спасибо, ясно. Сочувствую.

Serguei Kouzmine, видимо у нас с Вами достаточно разные представления о том, что такое Automation.

El Sanchez 30-11-2018 18:06 2843460

Цитата:

Цитата Charg
И выдает ошибку »

Charg, прочтите статью. Может поможет.

Serguei Kouzmine 30-11-2018 18:13 2843462

@charg все одинаково работает на всех платформах включая headless . учтите что так ка повершелл не компилируется то приходится писать длинные имена типов как
Код:

$width = 1200;
          $height = 800;
          $options.addArguments([System.Collections.Generic.List[string]]@('--headless',"--window-size=${width}x${height}", '-disable-gpu'))
          $options.addArguments(('user-data-dir={0}' -f ("${env:LOCALAPPDATA}\Google\Chrome\User Data" -replace '\\','/')))
        $locale = 'en-us'
        # http://knowledgevault-sharing.blogspot.com/2017/05/selenium-webdriver-with-powershell.html
        $options.addArguments(@('--allow-running-insecure-content', '--disable-infobars', '--enable-automation', '--kiosk', "--lang=${locale}"))
        $options.AddUserProfilePreference('credentials_enable_service', $false)
        $options.AddUserProfilePreference('profile.password_manager_enabled', $false)
        $selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver($options)

или использовать
accelerators

https://blogs.technet.microsoft.com/...-accelerators/

Charg 30-11-2018 19:46 2843473

El Sanchez, выглядит как мой случай. Согласно в FAQ по NTLM аутентификации в Kerio Control действительно нужно добавлять FQDN запись этого самого Kerio Control в зону Intranet, что я и сделал. Ну и еще валидный сертификат должен быть, он тоже есть.
Буду пробовать, спасибо.

Serguei Kouzmine, к сожалению, мои навыки программирования начинаются и заканчиваются на "перевел текст с английского на русский - примерно прикинул что делает этот код", а сам я с 0 не в состоянии ничего написать. В вашем коде не особо понимаю куда, собственно, засунуть ссылку по которой нужно перейти. Просто добавить как параметр внутрь $options.addArguments(@())?

Цитата:

Цитата Iska
Ну, и вместо простого Sleep'а лучше пользовать примерно такую конструкцию: »

Ну, в целом согласен - выглядит как более архитектурно-правильное решение, но всё равно sleep между двумя такими конструкциями архитектурно неверен (хоть и почти наверняка будет работать).
Я вот тут нагуглил такую штуку https://docs.microsoft.com/en-us/pre...365(v%3dvs.85). Но не понимаю как это применить. По идее нужно всунуть его где-то в цикл чтобы ожидать readystate = READYSTATE_COMPLETE пока redirectCount не будет равен 1?

Serguei Kouzmine 01-12-2018 09:16 2843516

@Charg слона я не заметил сначала - если NTLM то все... проприетрными технологиями никто кроме их самих не дружит. код который вы показали раньше вроде правильный посмотрите (сохраните в переменную что COM отвечает) . может что понятное он отвечает.

вот я немного изменил ваш чтобыо ткрывать страницу которая *мне* доступна находить там что нибудь для примера и печатать - работавет и окно не открывается . windows 8.1 то есть edge еще не ту. ie 11.
после работы если оштбка то в процессах ie висят и не один.. если ошибок нет то и в процессах ie нет
но на экране не появляется никогда..
скрипт
Код:

$ie = new-object -com 'internetexplorer.application'
$target_url = 'https://www.makemytrip.com/'
$ie.navigate2($target_url)
  while ($ie.Busy -or ($ie.ReadyState -ne 4)) {
    # 4 a.k.a. READYSTATE_COMPLETE
    write-debug 'waiting'
    start-sleep -milliseconds 100
  }
$ie.visible = $false
$debug =  $true
$debugpreference = 'continue'
$document = $ie.document
$document_element = $document.documentElement
$window = $document.parentWindow
if ($window -ne $null) {
  if ($document -ne $null) {
 
  $elements = $document_element.getElementsByTagName('script')

    write-output ('result: {0}' -f ($elements.Item(0).outerHTML))
  } else {
    write-output 'document is null'
  }
} else {
  write-output 'window is null'
}
# quit and dispose IE
$ie.Quit()
# [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie) | out-null
while ( [void]([System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie)) ) {}
Remove-Variable ie -ErrorAction SilentlyContinue

консоль
Код:

PS C:\developer\sergueik\powershell_internetexplorer_application>  . .\data_collector_test5.ps1
DEBUG: waiting
DEBUG: waiting
DEBUG: waiting
DEBUG: waiting
result: <script id="facebook-jssdk" src="//connect.facebook.net/en_US/sdk.js" async=""></script>

скрипт оч убогий как и IE - отлаживать что то боле серьезное времени нет но ваша страница переадресации вполне может изнутри браузера его потребовать стать видимым и против этого наверное нет приема

Charg 03-12-2018 14:33 2843926

В общем вопрос решился с помощью ссылки El Sanchez
Итоговый вариант выглядит так

Скрытый текст
Код:

Set IE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
' explanation for the row above:
' https://blogs.msdn.microsoft.com/ieinternals/2011/08/03/default-integrity-level-and-automation/


IE.Visible = False        ' set true for debug
IE.ToolBar = 0                ' set 1 for debug
IE.StatusBar = 0        ' set 1 for debug


IE.Navigate("https://kerio:4081/login")
' login process, must be in intranet zone in Internet Explorer

WScript.Sleep(5000)
' wait for kerio to successfully redirect us on webstatistics page

IE.Quit
' close IE


Iska 03-12-2018 16:29 2843942

Charg, только вместо простого Sleep'а лучше попробуйте пару вышеуказанных конструкций.


Время: 23:14.

Время: 23:14.
© OSzone.net 2001-