如何在客户端运行程序或批处理文件?

6
如何在客户端运行批处理文件?Exe文件呢?只是想在客户端打开预安装的程序?关于ActiveX,我尝试了。
    var activeXObj = new ActiveXObject("Shell.Application");
    activeXObj.ShellExecute("C:\\WINDOWS\\NOTEPAD.EXE", "", "", "open", "1");

但是这样做并不起作用。有什么建议吗?

4
这是不可能的 - JavaScript被专门设计为不允许这样做,因为这将是一个巨大的安全漏洞。不管是否必需,你都无法这样做。 - Joel Coehoorn
Flash播放器是一个应用程序,可以从JavaScript启动。没有它就没有YouTube! - Andomar
1
我认为也许我们需要在这一点上问一下——你实际上想做什么?你在客户端想要实现什么,你想从浏览器中完成什么任务?换句话说,为什么? - Michael Kohne
对于Internet Explorer,您应该将Web服务器添加到受信任站点列表中,并在“自定义”中将ActiveX控件权限设置为“询问”。 - KikoV
2
为什么不让用户下载批处理文件并执行呢?您可以使用HTML而无需JavaScript来实现此操作。 - Trylks
显示剩余4条评论
8个回答

39

从Javascript?你做不到。这是一种安全风险。想一想 - 你是否希望每个网站都能在你的电脑上运行程序?


我知道这是一个安全风险,但这是一个紧急需求,需要在客户端上运行预安装的程序,并且必须使用Javascript实现。 - Ahmed Atia
例如,您可以有一个批处理文件来恢复内部网站上的驱动器映射。 - Andomar
你可能可以使用Microsoft ClickOnce来实现这个功能(不可靠,需要IE浏览器和.NET应用程序)。可以提供更多的背景信息吗?这个网页是什么?应用程序是什么? - pjc50
12
pjc50并不是指“安全风险”在不可取的意义上,而是指浏览器不允许的“安全风险”的意义上。 - Matt G

11
你的意思是通过JavaScript在浏览器窗口中启动外部程序?你不可能那样做!那是一个该死的安全漏洞!

实际上是可能的:在Windows上,您可以使用自定义URL协议从浏览器窗口启动外部程序。 - Anderson Green

10
<script language="javascript" type="text/javascript">

    function RunEXE(prog) {
        var oShell = new ActiveXObject("WScript.Shell");
        oShell.Run('"' + prog + '"', 1);
    }     
</script>

1
以上解决方案仅适用于IE,需要用户允许运行ActiveX,但它有效!! - yurin

6
如果您真的可以控制客户端,则可能需要在客户端安装一些远程守护程序服务,例如SSH。
附:但是,请通过您的“服务器代码”来调用它。
更新:
不要灰心。您完全可以以安全的方式做到这一点。
1. 首先,您需要在客户端上拥有一个守护程序服务,该服务将处理调用您的应用程序的任务。个人而言,我更喜欢使用C ++或Delphi构建简单的RPC服务器作为Windows服务;但是许多其他类型的服务器也可以胜任(SSH,Apache,Telnet)。
2. 然后创建一个Web页面,允许用户使用适当的身份验证“注册”其服务以调用该服务(密码,安全密钥)。
3. 当您想要从已经注册的客户端的Web页面调用您的应用程序时,请使用ajax调用(XMLHttpRequest)到您的服务器。
4. 服务器应使用已注册信息验证请求IP地址。
5. 然后使用已注册信息对客户端进行远程命令调用。
这种方案可能存在某些网络情况无法运行的情况。但是,如果您真的可以控制执行环境,那么总会有一些解决方法。

但是如何从网页/ JavaScript 中实现这一点呢? - Ahmed Atia
向您的服务器发起一个Ajax调用。 - Sake
这仍然是一个可怕的解决方案,但它非常有趣,真是太棒了。理论上它是可行的,并且可以“安全”地完成,假设您可以信任服务器对客户端进行SSH访问。它只适用于Intranet环境,并且实际上永远不会成为实际的好解决方案,但它很棒,而且没有浏览器插件(例如Flash、Silverlight、Java小程序)!需要太多配置才能使那些甚至请求此功能的白痴用户使用。 - bambams
1
最后终于有人说了些有意义的话。这个网站上所有的答案都已经过时了。谢谢伙计。 - jagapathi

5

http://yourserver/batchfile.bat 是服务器端的,要执行的文件是客户端的吗? - Ahmed Atia
如果用户选择“运行”,它会将批处理文件下载到计算机并在那里执行。 - Andomar
@Ahmed:他建议您将浏览器指向下载.bat文件,并要求用户执行它。 - belgariontheking
@Ahmed,批处理文件很可能会引用本地安装的东西。 - TheBlastOne

3
如果问题在于批处理文件在浏览器中被显示,您需要在HTTP头中设置Content-TypeContent-Disposition,以便提示用户保存(或运行)文件,而不是让浏览器显示它。
您将无法在未经用户允许的情况下运行该文件,但这不应该成为问题。 请参考此问题以获取更多详细信息。

0

基本上,你做不到。如果你需要在客户端启动某些东西,你需要另一种机制,其中可能内置了一些安全性。之前的帖子提到了psexec(http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx),这显然只有在你对目标系统拥有适当的权限时才能工作,并且完全超出了浏览器范畴。

基本上,如果你能轻松地做到这一点,那么你所要求的是一个非常大的问题。

你可以尝试使用ActiveX,但我不知道现在对ActiveX对象有哪些限制(我知道有限制,但也许你可以在这些限制内工作)。


那么……JavaScript会要求服务器运行psexec在客户端上启动程序?我想应该可以。 - Andomar
是的,没错。而且,这仅在服务器以具有客户端适当权限的用户身份运行时才有效。 - Michael Kohne

0

出于安全原因,直接这样做是不允许的。除了其他所有答案,还有另一个想法。

您可以在预安装的程序中构建本地主机 REST 服务,并使用 JavaScript 通过命令或数据调用它,假设您编写了预安装的程序并且在调用时该服务应该正在运行。这个解决方案适用于某些情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接