Войти

Показать полную графическую версию : [решено] Как закрыть IE (Kerio NTLM)


Страниц : [1] 2

Charg
27-11-2018, 18:37
Есть такой код
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/control/content/microsoft-active-directory-apple-open-directory/how-to-use-a-windows-active-directory-group-policy-object-gpo-to-logon-and-logout-users-automatically-from-kerio-control-917.html

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

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

Iska
27-11-2018, 21:44
Charg, у меня — закрылся.

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

Serguei Kouzmine
27-11-2018, 23:23
по большому не пробовали ?

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

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

Iska
28-11-2018, 02:38
Iska, visible=false, по большому счету, тоже никакого эффекта не имеет, т.к. окно IE в любом случае отображается »
Неа. Не отображается.

В принципе на работе с коллегой заметили странный нюанс - если запускать этот скрипт даблкликом из 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
В общем выяснил что дело в самой странице, которую получает IE.
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
И выдает ошибку
https://i.imgur.com/Gf3MzeY.png
На строке 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
Charg, тогда можно смело обращаться в техподдержку Kerio с этим:
Оказалось что если открыть страницу https://kerio:4081/login/ в гуглохроме - пользователя нормально редиректит на страницу статистики керио (при условии наличия прав)
Если открыть ту же самую страницу в эксплорере (тот же пользователь и права) - редиректит на https://kerio:4081/login/blocked.php »
вопросом.

megaloman
28-11-2018, 22:08
Charg, Если хамским образом закрыть все экземпляры эксплорера, то после oIE.quitProgram = "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
@Charg у меня постепенно наполняется примерами github даже не репо а директория в другом репо - internetExplorer automation может пригодится когда *ставить вообще ничего нельзя* но это весьма трудоемкое скриптоделание очень уж он парши ^W нехороший инструмент - вот линк
https://github.com/sergueik/powershell_internetexplorer_application

Charg
29-11-2018, 09:26
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
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
@charg забудьте про ie и перейдите на Headless Chrome и здоровье сбережете
он работает с chome 70/ chromedriver 44 (на самом деле даже раньше на правильных OS

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

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

Iska
30-11-2018, 06:16
Serguei Kouzmine, а что, Google Chrome уже научился в Automation?

Serguei Kouzmine
30-11-2018, 06:49
представьте
selenium https://www.joecolantonio.com/selenium-webdriver-visual-studio/

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

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

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

Charg
30-11-2018, 11:35
Charg, вообще окно IE по умолчанию не должно отображаться. Я не знаю, может быть в новых ОС это поведение как-то изменилось?! На другой машине не пробовали поиграться с этим кодом? »
Ну, не знаю, у меня в конторе все компы раскатаны из одного образа, и тестил поведение я на таком же компе, соответственно и добиться результата я хочу именно на нем же.
Я конечно не исключаю что где-то чего-то может быть напортачено в образе, но сравнить поведение я могу разве что с серверными ОС. Есть 2019 и 2016 сервера - на обоих поведение то же самое (установлены с образов msdn).
@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
Charg, спасибо, ясно. Сочувствую.

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

El Sanchez
30-11-2018, 18:06
И выдает ошибку »
Charg, прочтите статью (https://blogs.msdn.microsoft.com/ieinternals/2011/08/03/default-integrity-level-and-automation/). Может поможет.

Serguei Kouzmine
30-11-2018, 18:13
@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/heyscriptingguy/2013/07/09/simplify-your-script-by-creating-powershell-type-accelerators/

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

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

Ну, и вместо простого Sleep'а лучше пользовать примерно такую конструкцию: »
Ну, в целом согласен - выглядит как более архитектурно-правильное решение, но всё равно sleep между двумя такими конструкциями архитектурно неверен (хоть и почти наверняка будет работать).
Я вот тут нагуглил такую штуку https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ff975365(v%3dvs.85). Но не понимаю как это применить. По идее нужно всунуть его где-то в цикл чтобы ожидать readystate = READYSTATE_COMPLETE пока redirectCount не будет равен 1?

Serguei Kouzmine
01-12-2018, 09:16
@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 - отлаживать что то боле серьезное времени нет но ваша страница переадресации вполне может изнутри браузера его потребовать стать видимым и против этого наверное нет приема




© OSzone.net 2001-2012