从HTML页面执行exe文件?

3
我想在单击本地HTML文件上的链接时启动本地exe文件(无需先将其保存到其他位置)。它需要在IE,Firefox,Chrome或Opera中工作,我不在意。这只是为了明天的演示。

2
考虑安全问题。我们不希望在点击链接时,人们启动本地应用程序。但是,您可以将特定的MIME类型与特定的应用程序关联起来。这就是当您请求与iTunes相关的内容时,iTunes如何启动的方式。 - Corbin March
是的,我知道,但这只是为了明天的演示。另一个选项是让应用程序运行并按alt-tab切换到它。 - Hedge
做吧。已经运行应用程序并切换到它以说明某些内容并不丢脸。 - KeithS
是的,你说得对。我把它放在了Windows 7超级任务栏的第一个位置。现在我可以秘密地按下Windows键+1来启动它(而不必在Alt+Tab菜单中翻跃窗口)。 - Hedge
@Hedge - 这个丑陋的 hack 算不上一个好答案,但你可以试试——更改你的 Firefox 应用选项(工具->选项->应用程序),让本地应用程序处理常见文件类型。也许将 XML 从“总是询问”或当前设置更改为你的应用程序。然后,将你的链接指向一个 XML 文件。不确定是否有效,但尝试一下也无妨。 - Corbin March
不错的想法,Corbin。但是我宁愿为明天的考试学习,也不想再写另一个工具 :) - Hedge
5个回答

1
我想分享我的经验。
接受的回复说这是不可能的,但可以通过间接的方式实现。
如果你想在电脑上执行一个exe程序,这意味着你有权访问这台电脑,并且可以在该机器上安装你的exe程序。
在我的情况下,我需要通过一个Web应用程序从3D扫描仪中获取3D扫描。一开始看起来似乎不可能。
经过大量研究,我发现我们可以通过javascript发送socket消息。
这意味着如果我们有一个监听特定端口的应用程序,它可以与网站通信。
让我们解释一下我是如何做到的。
在我的Web应用程序中,我创建了一个像这样的javascript方法:
    function openCapron3DScanner(foot) {
      $("#div-wait").show();

      //Creates a web socket pointed to local and the port 21000
      var ws = new WebSocket("ws://127.0.0.1:21000");
      ws.onopen = function () {

      //Sends the socket message to the application which listens the port 21000  
      ws.send(foot + "-" + @ProjectHelper.CurrentProject.Proj_ID);

     };
      ws.onerror = function myfunction() {
          $("#div-wait").hide();
          alert("Erreur connection scanner.");
      }

      ws.onmessage = function (evt) {
        //Receives the message and do something...
        var received_msg = evt.data;
         if (received_msg == "ErrorScan") {
            alert("Erreur scan.");
         }
         else {
            refreshCurrentProject();
         }
     };
    ws.onclose = function () {
        $("#div-wait").hide();
    };
};

我创建了一个Windows窗体应用程序,它监听本地主机和端口21000。 这个应用程序是隐藏的,只在图标托盘中显示。 唯一需要做的就是通过代码在第一次加载时将应用程序添加到Windows启动项中,以确保下一次Windows重启时它将被执行并监听该端口。
      private static WebSocketServer wsServer;
      static WebSocketSession LastSession;

      private void Form1_Load(object sender, EventArgs e)
      {
        wsServer = new WebSocketServer();
        int port = 21000;
        wsServer.Setup(port);

        wsServer.NewMessageReceived += WsServer_NewMessageReceived;

        wsServer.Start();
      }



    private static void WsServer_NewMessageReceived(WebSocketSession session, string value)
    {
        if (value.StartsWith("ScanComplete-"))
        {
            //If the scan is ok, uploads the result to the server via a webservice and updates the database.
            UploadImage(value);

            //Sends a confirmation answer to the web page to make it refresh itself and show the result.
            if (LastMacSession != null)
                LastMacSession.Send("ScanComplete");
        }
        else if (value == "ErrorScan")
        {
            //If the C++ application sends an error message
            if (LastMacSession != null)
                LastMacSession.Send("ErrorScan");
        }

        else//call the 3D Scanner from the web page
        {
            LastSession = session;//Keeps in memory the last session to be able to answer via a socket message

            //Calls the C++ exe with parameters to save the scan in the related folder.
            //In could be don in this same application if I had a solution to consume the scanner in C#.
            var proc = System.Diagnostics.Process.Start(@"C:\Program Files\MyProjectFolder\MyScannerAppC++.exe", projectID + " " + param);
        }
    }

我希望它能够帮助。


1

这是不可能的。如果可以,那么它将被视为安全漏洞并进行修复。在Firefox中需要几个小时,在IE中需要几个月。

更新:您可以尝试注册自定义协议:http://openwinforms.com/run_exe_from_javascript.html

但我相信浏览器仍然会提示您是否要运行该应用程序。


我对于那个特定的情况降低任何安全限制都没有问题。 - Hedge
1
HTML的安全性取决于源站点。从本地计算机或公司互联网加载的受信任的HTML文件启动应用程序不会被视为安全漏洞。实际上,这通常是加载类似于应用程序启动的ActiveX插件时使用的规则。 - Ben Voigt
@Ben Voigt:我认为ActiveX本身就是安全漏洞。 - František Žiačik
Java在确定小程序权限时也使用类路径吗? - Ben Voigt
如果客户操作系统支持,可以在浏览器中的模拟器中运行.exe文件。 - Anderson Green

0
使用System.Diagnostics.Process.Start()方法。
    protected void LinkButton1_Click(object sender, EventArgs e)
    {
        System.Diagnostics.Process.Start("notepad.exe");
    }

你需要使用C#,但既然这已经在你的帖子中了,那应该没问题。如果文件不在内存中加载的环境路径中,你还需要完整的路径。

对于一个“常规链接”,你仍然需要将其放置在ASPX页面中.....

<a href="test" onclick="<% System.Diagnostics.Process.Start("notepad.exe"); %>">点击我</a>

现在我们变得非常丑陋了。


是的,刚测试了一下,它运行得很好。protected void LinkButton1_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start("notepad.exe"); } - John Batdorf
Corbin,不确定你的意思?嗯,我理解为他想要在本地打开一个exe文件.... - John Batdorf
抱歉,我的表述不够清晰。我想通过在浏览器中点击链接来运行一个用C#编写的exe文件。 - Hedge
在我的本地PC上。该网站只是一个普通的HTML文件。 - Hedge
我已经移除了C#和.NET标志,因为它们似乎更加令人困惑。不过感谢您提供这个替代方案。 - Hedge
显示剩余8条评论

0

如果您的本地操作系统是Windows,您可以在注册表中设置自定义协议。 请查看thisthis

然后,您可以创建一个简单的HTML页面,并放置一个链接,类似于这样:

<a href="presentation://C:\\start.exe/">Start!</a>

假设您已经注册了自定义的“presentation”协议,并在注册表中正确配置了它,那么当您点击该链接时,应用程序应该会启动。


0
你不能在网站上运行exe文件。(首先,如果是Linux服务器,exe文件不能在其上运行;其次,如果您在Windows服务器上,则主机将立即终止程序,并可能终止您的帐户。)
该链接(假设它是Play Now!)只会让用户下载文件。(C:\Program Files\World of Warcraft\存在于您的计算机上,但不存在于Web服务器上。)

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