none
скрипт для ввода данных от пользователя не запускается из под администратора RRS feed

  • Вопрос

  • Дент добрый. 

    есть скрипт (приведу ниже) - для ввода данных от пользователя через окно html , данные вводятся все работает если скрипт запускать напрямую от пользователя. 

    если запускать его же от Администратора - то на панели и в процессах есть запуск скрипта - а окно запроса данных не выводится пользователю . - такое ощущение что вывод идет на другой рабочий стол (вернее пользователю от которого запущен скрипт) .

    вопрос -  как запустить от администратора и чтоб нормально отрабатывал ?

    возможно надо что-то дописать в  function createwindow() . чтобы правильно запускалось приложение.

    сам скрипт  (пример):

    dim completed
     
    msgbox inputboxml("Enter text:", "Multiline inputbox via HTA", "default" & vbcrlf & vbtab & "multiline" & vbcrlf & "text")
     
    function inputboxml(prompt, title, defval)
        dim window
        set window = createwindow()
        completed = 0
        defval = replace(replace(replace(defval, "&", "&amp;"), "<", "&lt;"), ">", "&gt;")
        with window
            with .document
                .title = title
                .body.style.background = "buttonface"
                .body.style.fontfamily = "consolas, courier new"
                .body.style.fontsize = "8pt"
                .body.innerhtml = "<div><center><nobr>" & prompt & "</nobr><br><br></center><textarea id='hta_textarea' style='font-family: consolas, courier new; width: 100%; height: 100px;'>" & defval & "</textarea><br><button id='hta_cancel' style='font-family: consolas, courier new; width: 85px; margin: 10px; padding: 3px; float: right;'>Cancel</button><button id='hta_ok' style='font-family: consolas, courier new; width: 85px; margin: 10px; padding: 3px; float: right;'>OK</button></div>"
            end with
            .resizeto 400, 230
            .moveto 100, 100
        end with
        window.hta_textarea.focus
        set window.hta_cancel.onclick = getref("hta_cancel")
        set window.hta_ok.onclick = getref("hta_ok")
        set window.document.body.onunload = getref("hta_onunload")
        do until completed > 0
            wscript.sleep 10
        loop
        select case completed
        case 1
            inputboxml = ""
        case 2
            inputboxml = ""
            window.close
        case 3
            inputboxml = window.hta_textarea.value
            window.close
        end select
    end function
     
    function createwindow()
        rem source [url]http://forum.script-coding.com/viewtopic.php?pid=75356#p75356[/url]
        dim signature, shellwnd, proc
        on error resume next
        signature = left(createobject("Scriptlet.TypeLib").guid, 38)
        do
            set proc = createobject("WScript.Shell").exec("mshta ""about:<html><head><script>moveTo(-32000,-32000);</script><hta:application id=app border=dialog minimizebutton=no maximizebutton=no scroll=no showintaskbar=yes contextmenu=no selection=yes innerborder=no icon=""%windir%\system32\notepad.exe""/><object id='shellwindow' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shellwindow.putproperty('" & signature & "',document.parentWindow);</script></head></html>""")
            do
                if proc.status > 0 then exit do
                for each shellwnd in createobject("Shell.Application").windows
                    set createwindow = shellwnd.getproperty(signature)
                    if err.number = 0 then exit function
                    err.clear
                next
            loop
        loop
    end function
     
    sub hta_onunload
        completed = 1
    end sub
     
    sub hta_cancel
        completed = 2
    end sub
     
    sub hta_ok
        completed = 3
    end sub
     


    25 августа 2017 г. 13:34

Ответы

  • ответов нет . сам не смог разобраться как перенацелить вывод окна на сессию "обычного" пользователя.

    поступил иначе. разбил скрипт на два скрипта . 

    в первом скрипте, запуск просто пользователем, далее от пользователя "жду" ввод данных с проверкой и повторным вбиванием если что-то не так указано. 

    далее, в конце первого скприпта - произвожу запуск второго скрипта от админа и передачей полученного значения.

    в конеце первого скрипта:

    path - путь откуда запустился первый скрипт. второй скрипт лежит там же.

    s1 - передаваемые значения.

    Set objShell = CreateObject("Shell.Application")
    objShell.ShellExecute "C:\Windows\System32\wscript.exe", path & "\b1.vbs " & s1, "", "runas", 1

    в начале второго скрипта (b1.vbs):

    Option Explicit
    Dim WshArguments, WshShell, i, list

    Set WshShell = CreateObject("Wscript.Shell")
    set WshArguments = WScript.Arguments   'Определяем, есть ли передача параметров 

    if WshArguments.count()=0 then     
    MsgBox "Передайте сценарию аргументы" 
    else     ' Производим перебор коллекции аргументов    
     for i=0 to WshArguments.Count-1  
           list = WshArguments(i)
        next    
    End if

    list - нужная переменная. если передавалось одно значение.

    ловлю значения во втором скрипте который уже с правами админа, и он уже отрабатывает по AD то что нужно. 

    30 августа 2017 г. 13:39

Все ответы

  • дело я так понимаю в том - что вывод осуществляется в другую сессию? (%~dp0 или %~f0) , надо правильно перенаправить вывод диалогового окна. 

    как правильно это сделеть ?

    29 августа 2017 г. 12:16
  • ответов нет . сам не смог разобраться как перенацелить вывод окна на сессию "обычного" пользователя.

    поступил иначе. разбил скрипт на два скрипта . 

    в первом скрипте, запуск просто пользователем, далее от пользователя "жду" ввод данных с проверкой и повторным вбиванием если что-то не так указано. 

    далее, в конце первого скприпта - произвожу запуск второго скрипта от админа и передачей полученного значения.

    в конеце первого скрипта:

    path - путь откуда запустился первый скрипт. второй скрипт лежит там же.

    s1 - передаваемые значения.

    Set objShell = CreateObject("Shell.Application")
    objShell.ShellExecute "C:\Windows\System32\wscript.exe", path & "\b1.vbs " & s1, "", "runas", 1

    в начале второго скрипта (b1.vbs):

    Option Explicit
    Dim WshArguments, WshShell, i, list

    Set WshShell = CreateObject("Wscript.Shell")
    set WshArguments = WScript.Arguments   'Определяем, есть ли передача параметров 

    if WshArguments.count()=0 then     
    MsgBox "Передайте сценарию аргументы" 
    else     ' Производим перебор коллекции аргументов    
     for i=0 to WshArguments.Count-1  
           list = WshArguments(i)
        next    
    End if

    list - нужная переменная. если передавалось одно значение.

    ловлю значения во втором скрипте который уже с правами админа, и он уже отрабатывает по AD то что нужно. 

    30 августа 2017 г. 13:39