【问题标题】:Launching an executable from a website?从网站启动可执行文件?
【发布时间】:2010-10-02 19:02:08
【问题描述】:

我们正在开发一个只能在 Intranet 上运行的站点,并且可以访问此 Intranet 的计算机将安装此可执行文件。我们不能有任何“您要打开 [文件名].exe 吗?”提示。点击一个链接,程序开始运行。

我意识到让网站能够在客户端机器上运行可执行文件是非常非常糟糕的,但管理层拒绝让步。

机器将配备带有 Firefox 3 的 Windows(XP 或更高版本)。

【问题讨论】:

    标签: windows web executable


    【解决方案1】:

    我可以想象的唯一方法是通过某种 ActiveX 控件来运行您的可执行文件,但我不知道这对于 Firefox 是否可行。

    这应该是你应该拒绝让步的事情之一,而不是管理。

    【讨论】:

    • 就像我的老板说的,“我不花钱请你做,我花钱请你按我的方式做”。
    • @Grant:如果你的老板坚持付钱给你做一些完全错误的事情——最终会在背后咬他和公司,而不是听取知识渊博的开发人员的意见,那么你你应该考虑在你的意见更受重视的地方工作。
    【解决方案2】:

    我建议你看看Adobe Flex / Air,它的设计考虑了这种模型以及它打开的固有安全谷仓门。

    【讨论】:

    • 链接是 404。这就是为什么答案不应该只是一个链接。
    【解决方案3】:

    我同意其余的,我很确定你不能再这样做了(尤其是在 Firefox 中)。这就是当时安装了多少间谍软件/广告软件程序。你必须表明立场,告诉管理层这是不可能的。

    【讨论】:

      【解决方案4】:

      主动 X 控件是最简单的方法。有一个用于 Firefox 的插件,允许您托管活动的 X 控件。或者你可以写一个 NS Plugin 来处理这个。

      【讨论】:

        【解决方案5】:

        This 是一篇关于可执行文件的 Web 部署的旧文章。我知道使用 Internet Explorer 可以做到这一点(由于我们分散的开发团队,我们仍然必须支持其中的一些)。我不知道 Firefox 的影响。

        【讨论】:

          【解决方案6】:

          试试这个 JavaScript:

          function executeCommands(inputparms)
          {
          // Instantiate the Shell object and invoke its execute method.
          
          var oShell = new ActiveXObject("Shell.Application");
          
          var commandtoRun = "c:\windows\Notepad.exe";
          
          // Invoke the execute method. 
          oShell.ShellExecute(commandtoRun, commandParms, "", "open", "1"); 
          }
          

          您必须相应地设置浏览器安全设置,这仅适用于 IE。

          【讨论】:

            【解决方案7】:

            我们正在开发一个只能在 Intranet 上运行的站点,并且可以访问此 Intranet 的计算机将安装此可执行文件。

            这是否意味着桌面上已经安装了 EXE?您只是想从网站上启动它?

            如果是这样,您可以将 EXE 与 MIME Content Type 关联,当用户单击它时,它将启动。

            为您的 EXE 名称选择内容类型和文件扩展名,例如:

            CauseChaos.exe 与 .chaos 文件扩展名相关联 内容类型将是:应用程序/混乱

            通过 EXE 安装将文件扩展名与您的 EXE 相关联。我在这里展示它,使用 InnoSetup

            [Registry]
            Root: HKCR; Subkey: .chaos; ValueType: string; ValueData: CauseChaos; Flags: uninsdeletekey
            Root: HKCR; Subkey: CauseChaos; ValueType: string; ValueData: CauseChaos Tool; Flags: uninsdeletekey 
            Root: HKCR; Subkey: CauseChaos\DefaultIcon; ValueType: string; ValueData: {app}\CauseChaos.exe,0; Flags: uninsdeletekey
            Root: HKCR; Subkey: CauseChaos\shell\open\command; ValueType: string; ValueData: "{app}\CauseChaos.exe ""%1"""; Flags: uninsdeletekey

            通过 EXE 安装将 MIME 内容类型与文件扩展名相关联。

            [Registry] (continued...)
            Root: HKCR; Subkey: HKCR\Mime\Database\Content Type\application/chaos; ValueType: string; ValueName: Extension; ValueData: .chaos; Flags: uninsdeletevalue

            【讨论】:

            • 关于如何将 MIME 类型添加到 Firefox 的任何想法?我发现我可以编辑当前存在的 MIME 类型列表,但我还没有找到如何添加新的。
            • 我补充了一点,希望能回答你的问题。
            • 好的,所以我创建了一个 CauseChaos.exe,它只是启动一个新进程(记事本)并退出。我像上面一样创建了 InnoSetup 脚本。它适用于空的 foo.chaos 文件。然后我创建了一个网页,将响应的内容类型更改为“应用程序/混乱”,但没有任何反应。我错过了什么?
            • 如果您双击 foo.chaos,您的应用程序会启动吗?如果是这样,那么您做对了第二步……听起来您的网页不正确。
            • 知道了,将 MIME 类型也添加到 IIS。谢谢。
            【解决方案8】:

            在用于 IE 的链接中使用“file:///c:/Program Files/myprogs/myprog.exe” URL。但是,我已经很久没有尝试过了。

            我会推荐上面的 MIME 类型方法或添加一个由该可执行文件处理的特殊 URI 前缀“chaos://myparams”。

            【讨论】:

              【解决方案9】:

              去过那里。 MIME 类型(在我添加此内容时已接受)需要在客户端和服务器上进行大量配置。这是一项相当多的工作,并且您最终会得到临时文件等。

              我们的解决方案是添加我们自己的“自定义 URL 协议处理程序”。基本上,添加 URL 类型 x-our-intranet 并使您的公司应用程序成为它的 URL 处理程序。现在任何链接都将启动您的公司应用程序,将“x-our-intrenet:foo”作为命令行参数传递。它只需要一个客户端注册表项,类似于 MIME 类型。

              【讨论】:

                【解决方案10】:

                我完全理解你想要什么。我在互联网上读到的只是人们提到这是一个重大的安全漏洞等......但是,我猜他们不明白你为什么要实施这个,我会解释为什么我需要这个并正在努力解决这个问题和越来越近了。

                我有许多不同的用户应用程序,例如。呼叫中心等... 我目前正在使用以 Kiosk 模式运行的锁定桌面。用户将看到的只是一个带有一些计算机信息和一个 IE 图标的蓝屏。我的目标是从此页面运行 Microsoft Office 和一些内部客户端/服务器应用程序。它工作得很好,因为一切都还在那里,只是我的用户看不到它。不过,我和你有同样的问题。我的网络使用 MPLS、内部和外部托管路由器、防火墙/ASA 和大量安全专业人员非常安全。另外,这仅限于内部。所以,在我看来它完全没问题。所以,如果我为此想出某种解决方案,我会发布它。

                【讨论】:

                  【解决方案11】:

                  如果您想运行计算机上已有的应用程序,您可以通过注册到注册表来实现,然后他们以 HTML 格式调用它,就像您发送电子邮件 (mailto) 一样。

                  所以,你只需要创建注册表:

                  using Microsoft.Win32;
                  using System;
                  using System.IO;
                  using System.Linq;
                  
                  namespace WMConsole
                  {
                      class Program
                      {
                          static void Main(string[] args)
                          {
                              Console.WriteLine("Listening..");
                  
                              //Gets the current location where the file is downloaded
                              var loc = System.Reflection.Assembly.GetExecutingAssembly().Location;
                              if (!Directory.Exists(@"D:\Console\"))
                              {
                                  System.IO.Directory.CreateDirectory(@"D:\Console\");
                              }
                              //Creates the Downloaded file in the specified folder
                              if (!File.Exists(@"D:\Console\" + loc.Split('\\').Last()))
                              {
                                  File.Move(loc, @"D:\Console\" + loc.Split('\\').Last());
                              }
                              var KeyTest = Registry.CurrentUser.OpenSubKey("Software", true).OpenSubKey("Classes", true);
                              RegistryKey key = KeyTest.CreateSubKey("alert");
                              key.SetValue("URL Protocol", "wnPing");
                              key.CreateSubKey(@"shell\open\command").SetValue("", @"D:\Console\WMConsole.exe %1");
                          }        
                      }
                  }
                  

                  然后您可以通过以下方式在 HTML 中调用它:

                  <a href="alert:wmPing">Click to trigger</a>
                  

                  这是关于它的完整文章: https://www.codeproject.com/Articles/1168356/Run-an-EXE-from-Web-Application

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-12-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-05-16
                    • 2014-01-15
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多