При выходе из системы или времени ожидания HTA запускает скрипт перезапуска, а затем завершает работу.Сценарий перезапуска ожидает завершения процесса MSHTA, затем перезапускает его и завершает работу.
Это можно сделать с помощью WMI для сканирования запущенных процессов и поиска экземпляра MSHTA.EXE, параметр командной строки которого содержит имя HTA.
Вот небольшой пример, демонстрирующийthis.
Это базовый HTA, сохраните его как RestartTest.hta:
<html> <!-- RestartTest.hta -->
<head>
<title>Self Restarting HTA Test</title>
<script language="VBScript">
sub RunApp(sApp)
CreateObject("WScript.Shell").Run(sApp)
end sub
sub LogOff()
RunApp "cscript.exe RestartHTA.vbs"
MsgBox "simulating delayed exit - click to close"
window.close()
end sub
</script>
</head>
<body >
<input type="button" value="Log off" onClick="LogOff()" />
</body>
</html>
Это скрипт перезапуска, сохраненный как RestartHTA.vbs:
' RestartHTA.vbs'
' wait until RestartTest.hta is not running and restart it.'
MSHTA = "mshta.exe"
sHTA = "RestartTest.hta"
say "waiting for process " & MSHTA & " with param " & sHTA & " to end"
secs = 2000
bRunning = vbTrue
do while bRunning
if ProcessRunning(MSHTA, sHTA) then
say "still running, wait a few seconds"
WScript.Sleep secs
else
bRunning = vbFalse
end if
loop
say "HTA not found, proceding to restart"
WScript.Sleep secs
CreateObject("WScript.Shell").Run(sHTA)
WScript.Quit
'---'
function ProcessRunning(sProcess, sParam)
set oWMI = GetObject( _
"winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
set cProcs = oWMI.ExecQuery( _
"select * from Win32_Process where Name = '" & sProcess & "'")
bFound = vbFalse
for each oProc in cProcs
say oProc.Name & ": " & oProc.CommandLine
if (InStr(oProc.CommandLine, sParam) > 0) then
say "found"
bFound = vbTrue
else
say "wrong param"
end if
next
ProcessRunning = bFound
end function
sub Say(s)
WScript.Echo s
end sub
'==='
Вы можете запустить любой из них, чтобы начать цикл, а затем просто закрыть HTA кнопкой X, чтобы прервать его.Обратите внимание, что я запускаю скрипт перезапуска с CScript явно.Это просто для демонстрации вывода на консоль в демонстрационных целях (и из-за проблем с настройкой и сохранением CScript по умолчанию на моем компьютере по какой-то причине).