通过Wscript.Shell运行从HTA调用MSG.exe

通过Wscript.Shell运行从HTA调用MSG.exe,shell,windows-7,hta,Shell,Windows 7,Hta,不管我做什么,我都不能让它工作。即使我在BAT文件中删除“msg/server:”语法并从Shell.Run调用它,它仍然会说“'msg'不被识别为内部或外部命令、可操作程序或批处理文件。” 我还尝试了“msg.exe”和“c:\windows\system32\msg.exe”。所有表单都可以通过CMD控制台直接输入、VBScript或CMD/BAT脚本正常工作,但不能通过HTA。这是“设计”的安全功能吗?是否还有其他解决方法?为了向后兼容,64位Windows附带了两个版本的MSHTA.ex

不管我做什么,我都不能让它工作。即使我在BAT文件中删除“msg/server:”语法并从Shell.Run调用它,它仍然会说“'msg'不被识别为内部或外部命令、可操作程序或批处理文件。”


我还尝试了“msg.exe”和“c:\windows\system32\msg.exe”。所有表单都可以通过CMD控制台直接输入、VBScript或CMD/BAT脚本正常工作,但不能通过HTA。这是“设计”的安全功能吗?是否还有其他解决方法?

为了向后兼容,64位Windows附带了两个版本的MSHTA.exe:

  C:\Windows\SysWOW64\mshta.exe and 
  C:\Windows\System32\mshta.exe
您描述的行为是64位MSHTA.exe的一个奇怪之处,它不能调用像MSG.exe这样的32位应用程序。请注意,位于c:\windows\SysWOW64\cmd.exe的64位命令提示符也将无法找到MSG.exe

要解决此问题,您可以将.hta文件与32位MSHTA.exe关联,或者创建一个简单的批处理文件来启动hta,start_MSG.cmd:

START C:\Windows\System32\mshta.exe C:\YOUR_PATH\MSG.hta
我已经用64位和32位版本的MSHTA.exe测试了下面的HTA。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> 

变量E,LineWriteTimeId
函数execWithStatus(cmdLine){
E=新的ActiveXObject(“WScript.Shell”).Exec(cmdLine);
lineWriteTimeId=window.setInterval(“writeOutLine()”,100);
E.StdIn.Close();
}
函数writeOutLine(){
if(例如StdOut.AtEndOfStream)window.clearTimeout(linewritetimeid);
如果(!E.StdErr.AtEndOfStream)txtResults.value+=“错误:”+E.StdErr.ReadAll()+“\n”;
如果(!E.StdOut.AtEndOfStream)txtResults.value+=E.StdOut.ReadLine()+“\n”;
}
MSG.exe
跑


请发布调用CMD的代码。