HTA Использование HTA

Гимаев Наиль

Участник
Сообщения
59
Реакции
99
Протестировать до конца не получилось, т.к. положил в папку, имя которой начинается с восклицательного знака.
Папки начинающиеся с восклицательного знака становятся первыми в файловом менеджере, это как своеобразная отметка избранных папок.
Естественно, антивирусная папка для меня самая важная и находится она на флэшке (не в сети). Из всего сказанного следуют такие изменения:
http://diffchecker.com/h32s8tat
На полную отладку времени не хватило, поэтому вариант ещё не до конца рабочий. Суть в двух словах такая: если папка не в сети, то использовать нужно относительный путь. Тогда всякие не правильные символы не будут влиять на работу скрипта.Немного оффтопик. Когда я пишу автономные скрипты, то я пользуюсь cmd. А вот для интерактивных (массового пользования) намного полезнее пользоваться HTA.
Немного расскажу, для тех кто не знает.
HTA - технология для создания скриптового десктопного приложения. Так как в его основе лежит cscript, то имеются все возможности для работы с файловой системой, реестром и wmi на языках vbscript и javascript. Но кроме этого у hta-приложения есть окно, интерфейс которого представляет собой html-страницу. Другими словами, когда функционал будет готов, навести глянец на приложение сможет любой веб-дизайнер.
Чтобы оценить насколько эта технология может быть полезна приведу несколько примеров.
Ссылка заменена модератором. - Простейшее приложение, часть (ссылка недействительна). Пример работы с реестром.
kbTrainer - (ссылка заменена) Клавиатурный тренажёр. Пример интерактивности.
TiddlyWiki.hta - самоизменяемое приложение способное хранить внутри себя даже бинарные файлы, в частности картинки для оформления самого себя. Пример того, как можно хранить всё в одном единственном файле.
driverpacksolution - изюминка на торте. Самое большое из известных мне hta-приложений. Способно за десять минут установить полный комплект драйверов на любой десктопный компьютер. Пример того, к чему мы должны стремиться при работе над ViruLogs.
Ещё раз уточню, что это оффттопик, т.к. большинство из постоянных участников темы работает с cmd и может помочь Dragokas'у в его начинаниях. А вот с hta мало кто из нас может ему помочь. К примеру у меня не хватает на это времени, а у большинства - опыта. Но мне кажется, что ViruLogs обретёт популярность, если к нему добавить качественный интерфейс.
 
Последнее редактирование модератором:
Тест самоэлевации прав HTA-приложением.
Пробы пера оформления интерфейса.
Тест определения браузера по-умолчанию. Тест копирования в буфер.

Elevate_test.png

SysWOW64 -> System32 поправил. Там не нужна переадресация.
 

Вложения

  • HTA_Elevate.zip
    98.3 KB · Просмотры: 29
Последнее редактирование:
FraidZZ, да, можно и без пути. Кстати, интересно, что путь к самому .HTA нужно указывать полностью. Рабочий каталог не устраивает его.
 
Последнее редактирование:
HTML:
<html>
    <head>
    <title>ViruLogs Collector by Dragokas</title>

    <HTA:APPLICATION
        ID="objHTA"
        APPLICATIONNAME="ViruLogs Collector by Dragokas"
        SINGLEINSTANCE="no"
        BORDER="thin"
        BorderStyle="complex"
        SCROLL="no"
        Navigable="yes"
        maximizebutton="no"
        minimizebutton="no"
        WINDOWSTATE="normal"
        ContextMenu="no"
        SysMenu="yes"
        Icon='logon.ico'
    />

    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<style>
    BODY
    {
        background-color: RGB(40, 0, 115);
        font-color: RGB(80, 0, 200);
        font-family: Helvetica;
        font-size: 8pt;
        margin-top: 10px;
        margin-left: 15px;   
    }
</style>

<script language="VBScript">
<!--

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
Set oShap = CreateObject("Shell.Application")
Set oNetwork = CreateObject("WScript.Network")

Dim sUserName
Dim sComputerName
Dim sDomain
Dim Def_EXE
Dim Def_Path
Dim Def_Name

HTA = location.pathname
HTA_Path = Left(HTA,InStrRev(HTA,"\"))

Sub Window_onLoad()
    self.Focus()
    SetSize
    If oFSO.FileExists(HTA_Path & "logo.png") Then
        Logo.src = "logo.png"
    end if
    Browser_Default_Get()
    html = "<body id=""mainbody"" bgcolor=""white"" style=""font:Verdana; color:white"" onclick=""hold"">"
    html = html & "<TABLE><TR><TD><B>OS:</B><TD>" & GetOSName() & "</TR>"
    html = html & "<TR><TD><B>Default Browser:</B><TD>" & Def_Name & "</TR>" 
    html = html & "<TR><TD><B>Browser Location:</B><TD>" & Def_Path & "</TR></TABLE></body>" 
    Form.InnerHTML = html
    Elevate()
    GetComputerInfo()
    UserName.InnerHTML = sUserName
    ComputerName.InnerHTML = sComputerName
    document.all.status.InnerText = "Протокол работы скрипта будет здесь."
End Sub

Function SetSize()
    x=700
    y=550
    window.resizeTo x, y
    window.moveTo ((screen.availWidth / 2) - (x / 2)), ((screen.availHeight / 2) - (y / 2))
end function

Sub GetComputerInfo()
    sUserName = oNetwork.UserName
    sComputerName = UCase((oNetwork.ComputerName))
    sDomain = UCase((oNetwork.UserDomain))
End Sub

Function GetOSName()
    GetOSName = oShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")
End Function

Function GetOSVersion()
    GetOS = oShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")
End Function

Function Elevate()
    Const DQ = """"
    Set colOS = GetObject("winmgmts:\root\cimv2").ExecQuery("Select * from Win32_OperatingSystem")
    For Each oOS In colOS
        strOSLong = oOS.Version
    Next
    If Left(strOSLong, 1) = "6" Then
        If Not isAdminRights() Then
            oShap.ShellExecute "mshta.exe", objHTA.commandLine, "", "runas", 1
            HTA_Close()
        End If
    End If
end function

Function isAdminRights()
    Const HKCU = &H80000001, HKLM = &H80000002, KQV = &H1, KSV = &H2
    Set oReg = GetObject("winmgmts:root\default:StdRegProv")
    strKey = "System\CurrentControlSet\Control\Session Manager"
    intErrNum = oReg.CheckAccess(HKLM, strKey, KQV + KSV, flagAccess)
    isAdminRights = flagAccess
End Function

Sub Browser_Default_Get()
    if Left(GetOSVersion(), 1) = "5" then
        Browser_Default_Get_Win_XP
    else
        Browser_Default_Get_Win_7
    end if
End Sub

Sub Browser_Default_Get_Win_7()
    progid_key = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice\Progid"

    progID = oShell.RegRead(progid_key)
    def_cmd = oShell.RegRead("HKCR\" & progID & "\shell\open\command\")

    If Left(def_cmd, 1) = """" Then
        Def_Path = Mid(def_cmd, 2, InStr(2, def_cmd, """") - 2)
    Else
        Def_Path = Split(def_cmd)(0)
    End If

    Def_EXE = Mid(Def_Path, InStrRev(Def_Path, "\") + 1)
    Def_Name = Left(Def_EXE, InStrRev(Def_EXE, ".") - 1)
End Sub

Sub Browser_Default_Get_Win_XP()
    Def_EXE = oShell.RegRead("HKLM\SOFTWARE\Clients\StartMenuInternet\")
    Def_Path = oShell.RegRead("HKLM\SOFTWARE\Clients\StartMenuInternet\" & Def_EXE & "\shell\open\command")
   
    Def_Name = Left(Def_EXE, InStrRev(Def_EXE, ".") - 1)
End Sub

Sub ClipBoard_Set(strText)
    document.parentwindow.clipboardData.SetData "text", strText
End Sub

Sub CopyC()
document.parentWindow.clipboardData.setData "text", document.all.status.InnerText
document.getElementById("copywin").innerText = "Windows (Скопировано)"
End Sub

Sub BackWin()
document.getElementById("copywin").innerText = "Windows"
End Sub

Function ClipBoard_Get()
    ClipBoard_Get = document.parentwindow.clipboardData.GetData("text")
End Function

Function HTA_Close
    window.close()
End function

Sub Default_Buttons
    If Window.Event.KeyCode = 13 Then
        Msgbox "Enter Event"
    End If
End Sub

Sub Hold()

End Sub
//-->
</script>

<body id="mainbody" bgcolor="white" style="font:Verdana; color:white" onclick="hold">
    <table width="100%" border="0" cellpadding="0">
        <tr valign="center">
            <td align="left" width="70%">
                <img HEIGHT="100" width="120" name="Logo">
            </td>
            <td align="right" width="100%">
                <font size="3">ViruLogs Collector&nbsp;<strong>
                <br></br>
                <strong><font face="bold" size="3">Logon: <span style="color:red" id="UserName"></span><br></br>Computer: <span style="color:red" id="ComputerName"></span></strong>
            </td>
        </tr>
        <tr>
            <td>
            </td>
        </tr>
    </table>
    <table width="100%" border="0" cellpadding="0">
        <tr align="left">
            <td>
                <textarea rows="5" name="status" cols="73" style="font-family: Verdana; font-weight:bold; font-size: 8pt"></textarea>
            </td>
        </tr>
        <hr color="red">
    </table>
    <table width="100%" border="0" cellpadding="0">
        <tr valign="top">
            <td align="left" width="70%">
                <span style="font-size: 8pt;">Скопировать протокол в буфер обмена :  </span><a onmouseout="BackWin" id="copywin" style="font-size: 8pt; color: white;" onclick='CopyC' href='#'>Windows</button>
            </td>
            <td align="right" width="50%">
                <span id="countdown"></span><input type="button"  name="btn_close" style="display:none" value="Close" onclick="CloseSelf">
            </td>
            <td align="right" width="50%">
                <font size="2.25">Hi :)</font>
            </td>
        </tr>
    </table>
</body>


<body> 
    <H2>HTA Path info:</H2>
    <SPAN ID=Form></SPAN> 
</body> 

</html>
путь к самому .HTA нужно указывать полностью. Рабочий каталог не устраивает его
Да, заметил. Интересно, почему?
 
Интересно, почему?
Подозреваю, что из-за админских прав. По крайней мере cmd забывает рабочую папку, если запустить под админскими правами.
Другими словами повышенные права меняют контекст, например, переменные окружения. Не проверял, но это кажется логичным. В противном случае можно было бы подменить админу %ComSpec%
 
Последнее редактирование:
Проверил, права не влияют.
Но и ошибок не выдает, когда имя файла неверное.
 
Проверил, права не влияют.
Посмотрел поближе на mshta. В mshta зашито игнорирование относительных путей. Путь обязательно должен быть полным (с именем диска) или сетевым. Иначе mshta просто закрывается. Зато если путь полный, mshta запустится, не смотря на фактическое отсутствие файла.
Так ViruLogs Collector by Dragokas будет упакован в HTA?
Я хотел предложить упаковывать ViruLogs Collector в самораспаковывающийся архив rar так, как это делает CureIt.
Тогда сценарий использования будет выглядеть так:
1. Пользователь скачивает единственный исполнимый файл с сайта и запускает его
2. Тот в тихом режиме распаковывается в папку temp (средствами sfx)
3. Оттуда запускается (средствами sfx) HTA с красивым и понятным интерфейсом
4. В HTA два режима: "Стандарт" и "Эксперт" по аналогии с DriverPack Solution. В стандартном режиме одна большая кнопка "Старт". В режиме эксперта Можно задать параметры сбора логов и сетевые настройки. На основе настроек создаётся ini файл, который передаётся на вход батнику дополнительным параметром.
5. Скрытый батник ведёт логирование, hta отображает ход процесса.

Для чего это нужно.
Во-первых, пользователю не нужна будет инструкция для того, чтобы найти исполняемый файл среди множества вспомогательных.
Во-вторых, у исполняемого файла появляется красивая иконка, которой не может быть не у батника, не у hta.

Но взамен мы имеем три уровня вместо одного, на каждом из которых могут быть проблемы:
* не корректная переменная %temp% - sfx-архив не распакуется (и CureIt! тоже)
* повреждён IWebBrowser или IE - не запуститься HTA
* заблокирован CMD - не запуститься батник
К счастью, большинство из этих проблем может быть решено inf-файлом.
 
Последнее редактирование:
Koza Nozdri,
//TODO:
В планах:
58. GUI-интерфейс HTA (HyperText Application), перевод на VBScript.
Пока на HTA планируется только расблокировка файловых ассоциаций.
+ делаю заготовку интерфейса. В переводе кода особо нет сложностей.
WGET, к примеру, все равно будет использоваться. Не собираюсь отказываться.
Посмотрел поближе на mshta.
Чем смотрел?
повреждён IWebBrowser или IE - не запуститься HTA
или пользователь, который удаляет IE.
 
Последнее редактирование:
ProcMon.exe от sysinternal. В глаза бросается, что mshta даже не пытается искать файлы с относительным путём.
или пользователь, который удаляет IE.
Т.к. IWebBrowser используется в работе "Установка, удаление программ" (в XP точно, а про Win7+ не уверен), то есть подозрение, что даже после удаления IE, mshta будет продолжать работать.
 
В любом случае удаление IE и сопровождающих компонентов влечет за собой нарушение работоспособности функционала операционной системы,в природе встречается не часто.
 
Стоит протестировать. В интернетах раньше часто видел советы, как удалить IE.
 
В любом случае удаление IE и сопровождающих компонентов влечет за собой нарушение работоспособности функционала операционной системы
только на XP и г****сбощиков это не останавливает.
 
Назад
Сверху Снизу