1

Тема: HTA+win7: запуск из окна,работающ.другой у/з, процесса консольн.юзера

Windows-7 имеет такую особенность, что из приложения, работающего от имени другой у/з, explorer.exe не запускается от имени у/з приложения -- а всегда от имени "родного" пользователя, т.е. того, кем залогинены на консоли системы.

Это иногда вставляет палки в колеса, но... бывает и неожиданно помогает


Например, HTA-приложение запущено через "Run as different user..." специальной админской у/з и все процессы, которые оно запускает от себя, в т.ч. и открытие url-ов в браузере естесственно выполняются от имени этой у/з.

А при необходимости открытия url от имени Вашей "пользовательской" у/з (например, именно ею авторизуется вход на некий сайт, к примеру - СервисДеск некий), этот адрес всего навсего достаточно передать в качестве параметра (взяв в кавычки) при старте Explorer.exe.


Такой функционал для работы с hta просто реализуется в виде добавленния пункта контекстного меню в IE, работающий под "админкой". Пункт появляется на клике ПКМ на объекте окна, содержащего линк, и вызывает старт explorer с передачей ему линка, на отором был выполнен клик.


Под спойлером - код странички добавляемого пункта меню и скрипт настройки IE

+ открыть спойлер

IE_W7_open_url_by_consoleUser.htm - код страницы пункта меню "_open_url_by_consoleUser"


<!-- IE_W7_open_url_by_consoleUser.htm
Данная страничка выполняет запуск полученного url через старт exeplorer.exe .

Если страница (например, HTA-приложение) было открыто от имени некого другого пользователя, то адрес, на котором был выолнен клик,
будет открыт от имени основного пользоватея, которым мы работаем на консоли данной машины 
(от имени которого работает процесс explorer.exe)

Меню вызова этой страницы настраивается запуском скрипта - "IE_W7_open_url_by_consoleUser--setup.vbs". 
-->

<html style="width: 300px; height: 80px; margin: 1px; status:1">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta name="Author" content="Roman.Gerashchenko@otpbank.com.ua">
<meta name="Description" content="Start URL by explorer">

<head>
<title>Start URL by explorer</title>
</head>

<!-- ========================================= HTML ===========================================  -->

<BODY BGCOLOR="#C0C0C0" onload="Window_OnLoad();">
<p align="center">
<small>
<i>&nbsp;IE_W7_open_url_by_consoleUser.htm v0.1 by 15.01.2014 &nbsp;&copy; R.G.</i></small></p>
<script language="JavaScript">

// отрабатывает при открытии окна - получение значений из "вызвавшей" страницы
function Window_OnLoad()
{
    var parentwin = external.menuArguments;     // получаем объект окна
    var clickUrl = parentwin.event.srcElement;  // элемент окна, на котором произошло событие
    // alert('clickUrl\n-----\n' + clickUrl );     ///// отладочное сообщение
    
    var objShell = new ActiveXObject("WScript.shell"); 
    objShell.run('explorer.exe "' + clickUrl + '"'); // старт адреса через Explorer

    window.close(); // закрываем окно скрипта
}

</script>
</body>
</html>

IE_W7_open_url_by_consoleUser--setup.vbs - настройка браузера: добавляет пункт меню и убирает. HTML-файл должен будет оставаться лежать в папке, из которой запускали скрипт настройки.


' IE_W7_open_url_by_consoleUser--setup.vbs
' ----------------------------------------------------------------------------------------
' Добавляет/Удаляет в контекстное меню Internet Explorer пункт "_open_url_by_consoleUser"
' ----------------------------------------------------------------------------------------

Dim sMenu, REG_MENUEXT, rc
'--- имя добавляемого пункта
sMenu = "_open_url_by_consoleUser" 'имя добавляемого пункта

REG_MENUEXT = "HKCU\Software\Microsoft\Internet Explorer\MenuExt\" ' путь к меню Internet Explorer в реестре

Set WshShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

'--- проверка наличия в IE нашего пункта'
If uf_keyExists( REG_MENUEXT & sMenu & "\" ) Then 
    '--- менюшка уже есть, предлагаем удалить'
    rc=MsgBox("Удалять из меню Internet Explorer данный пункт ?" & vbCrLf , vbQuestion + vbOKCancel, sMenu)
    If rc=vbOK Then
        WshShell.RegDelete( REG_MENUEXT & sMenu & "\" )
        MsgBox "Удаление выполнено." & vbCrLf &_
            "Перезапустите Internet Explorer, чтобы изменения вступили в силу" & vbCrLf & vbCrLf, _
            vbInformation, "Удаление в IE меню """ & sMenu & """"
    End IF
else '--- пункта меню нет, предлагаем установить'
    rc = MsgBox("Хотите добавить в контекстное меню Internet Explorer пункт """ & sMenu & """" & vbCrLf & vbCrLf & _
        "для возможности открытия url-адреса от имени текущего консольного пользователя Windows7 ?" & vbCrLf & vbCrLf, _
        vbYesNo OR vbQuestion, "Установка """ & sMenu & """")
    If rc=vbYes Then
        Dim sPathApp, sPathHTM, REG_NEWMENU
        sPathApp = fso.GetAbsolutePathName(".") 'путь к каталогу запуска задачи'
        sPathHTM = sPathApp & "\IE_W7_open_url_by_consoleUser.htm" 'путь к программе добавления ссылок'''''''''''''''''''''''''''''''''
        ' Записываем в реестр требуемые значения
        REG_NEWMENU = REG_MENUEXT & sMenu & "\"
        WshShell.RegWrite REG_NEWMENU, sPathHTM, "REG_SZ"
        ' WshShell.RegWrite REG_NEWMENU & "Contexts", 1+2+4+8+16+32, "REG_DWORD"
        WshShell.RegWrite REG_NEWMENU & "Contexts", 32, "REG_DWORD" 'Ссылка 0x20'
        WshShell.RegWrite REG_NEWMENU & "Flags",    1, "REG_DWORD"
        MsgBox "Данные были успешно внесены," & vbCrLf & _
            "путь к программе прописан следующий - """&sPathHTM&"""." & vbCrLf & vbCrLf & _
            "Перезапустите Internet Explorer, чтобы изменения вступили в силу, " &_
            "добавленный пункт будет отображаться в контекстном меню при наличии выделенного на странице текста." & vbCrLf &vbCrLf,_
            vbInformation, sMenu
    End IF
End If

Set FSO = Nothing
Set WshShell = Nothing


'--- проверка наличия ключа реестра'
Function uf_keyExists(key)
  Dim key2    
  On Error Resume Next
  key2 = WshShell.RegRead(key)
  If Err <> 0 Then
    uf_keyExists = False
  Else
    uf_keyExists = True
  End If
  On Error GoTo 0
End Function

WBR. Roman