Вызов MSG.exe из HTA через Wscript.Shell Run

Я не могу заставить это работать независимо от того, что я делаю. Даже если я удаляю синтаксис «msg / server:» в файле BAT и вызываю его из Shell.Run, он все равно говорит: «msg» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл».

Я также пробовал "msg.exe" и "c:\windows\system32\msg.exe". Все формы прекрасно работают при прямом входе в консоль CMD, а также при использовании сценария VBScript или CMD/BAT, но не при использовании HTA. Это функция безопасности "по замыслу"? Есть ли что-нибудь вокруг этого?


person Skatterbrainz    schedule 23.03.2012    source источник
comment
Пожалуйста, опубликуйте код, который должен вызывать CMD.   -  person Teemu    schedule 24.03.2012


Ответы (1)


Для обратной совместимости 64-разрядная версия Windows поставляется с двумя версиями MSHTA.exe:

  C:\Windows\SysWOW64\mshta.exe and 
  C:\Windows\System32\mshta.exe

Описанное вами поведение является одним из курьезов 64-битного MSHTA.exe, он не может запускать 32-битные приложения, такие как MSG.exe. Обратите внимание, что 64-разрядная командная строка c:\windows\SysWOW64\cmd.exe также не сможет найти MSG.exe.

Чтобы исправить это, вы можете связать файлы .hta с 32-разрядным MSHTA.exe или создать простой пакетный файл для запуска HTA, START_MSG.cmd:

START C:\Windows\System32\mshta.exe C:\YOUR_PATH\MSG.hta

Я протестировал приведенный ниже HTA как с 64-разрядной, так и с 32-разрядной версиями MSHTA.exe. 64-битная версия выдает ошибку "файл не найден", но 32-битная версия работает.

<script language="Javascript">
var E, LineWriteTimerID
function execWithStatus(cmdLine){ 
    E = new ActiveXObject("WScript.Shell").Exec(cmdLine);
    LineWriteTimerID = window.setInterval("writeOutLine()",100); 
    E.StdIn.Close();  
}
function writeOutLine(){
    if(E.StdOut.AtEndOfStream) window.clearTimeout(LineWriteTimerID);
    if(!E.StdErr.AtEndOfStream) txtResults.value += "ERROR: " + E.StdErr.ReadAll() + "\n";
    if(!E.StdOut.AtEndOfStream) txtResults.value += E.StdOut.ReadLine() + "\n";
}
</script>
 <textarea id=txtCmd style="width:90%" rows=1>MSG.exe</textarea> 
 <button onclick="execWithStatus(txtCmd.value)">Run</button>
 <br><textarea id=txtResults style="width:100%" rows=20></textarea> 
person Rich    schedule 12.06.2012