如何从网页 (asp.net) 启动 EXE

Posted

技术标签:

【中文标题】如何从网页 (asp.net) 启动 EXE【英文标题】:How to launch an EXE from Web page (asp.net) 【发布时间】:2010-10-29 08:25:25 【问题描述】:

这是一个内部 Web 应用程序,我们希望网页包含指向多个 Win32 EXE 实用程序的链接。 EXE 由我们信任并由我们制作。 (不管它是否询问是否可以运行或保存)。我尝试了仅在本地工作的直接链接(例如 C:\notepad.exe)。 (这将是网络上的一个共享)。试过 File:/// 没有用。 IE7是需要的浏览器。

【问题讨论】:

真正的答案在这里:***.com/questions/3057576/… 【参考方案1】:

在windows中,可以在注册表中注册应用程序的指定协议。 在此msdn doc 中显示了将应用程序注册到 URI 方案。

例如,要启动一个可执行文件“alert.exe”。可以注册以下项目。

HKEY_CLASSES_ROOT
   alert
      (Default) = "URL:Alert Protocol"
      URL Protocol = ""
      DefaultIcon
         (Default) = "alert.exe,1"
      shell
         open
            command
               (Default) = "C:\Program Files\Alert\alert.exe"

然后你可以写一个html来测试

<head>
    <title>alter</title>
</head>

<body>
    <a href="alert:" >alert</a>
<body>

【讨论】:

【参考方案2】:

这假定 exe 位于用户计算机上您知道的某个位置:

<a href="javascript:LaunchApp()">Launch the executable</a>

<script>
function LaunchApp() 
if (!document.all) 
  alert ("Available only with Internet Explorer.");
  return;

var ws = new ActiveXObject("WScript.Shell");
ws.Exec("C:\\Windows\\notepad.exe");

</script>

文档:ActiveXObject、Exec Method (Windows Script Host)。

【讨论】:

这很好用!对于任何需要从 UI 启动应用程序并且有能力限制分发到 IE 的人来说,这比在 .NET 或 Qt 等中构建 UI 要容易得多。也非常适合编写 UI 来测试 EXE。 我们怎样才能像上面那样启动chrome?【参考方案3】:

作为 Larry K 建议的solution 的一部分,注册您自己的协议可能是一种可能的解决方案。 该网页可以包含一个简单的链接来下载和安装应用程序 - 然后在 Windows 注册表中注册自己的协议。

然后网页将包含带有参数的链接,这些参数将导致注册程序被打开,并且链接中指定的任何参数都被传递给它。 MSDN 上对如何执行此操作有很好的描述

【讨论】:

【参考方案4】:

在使用链接时,您可以通过使用 Fiddler 跟随操作来了解 iTunes 是如何做到的: http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=80028216

    它会下载一个 js 文件 在 windows 上:js 文件确定计算机上是否安装了 iTunes: 如果是 IE,则查找 activeX 浏览器组件,如果是 FF,则查找浏览器插件 如果安装了 iTunes,则浏览器将被重定向到带有特殊传输的 URL:itms://... 浏览器调用处理程序(由 iTunes exe 提供)。这包括启动尚未运行的 exe。 iTunes exe 使用特殊 URL 的其余部分向用户显示特定页面。

请注意,安装该 exe 时,会安装 URL 协议处理程序,用于与浏览器进行“itms”传输。

不是一个简单的工程项目可以复制,但绝对可行。如果您继续这样做,请考虑将相关软件开源。

【讨论】:

【参考方案5】:

如果应用程序是 C#,您可以使用 ClickOnce deployment,如果您不能保证用户将拥有该应用程序,这是一个不错的选择,但是您必须使用部署选项重新构建应用程序并获取每个项目的一些样板代码。

您也可以使用Javascript。

或者您可以将应用程序注册到您可以定义的handle a new web protocol。这也可能是“应用程序选择”协议,因此每次单击应用程序时,它都会链接到新协议上的页面,然后将此协议的所有处理传递给您的“选择应用程序”,该应用程序使用参数来查找和启动客户端 PC 上的应用程序。

HTH

【讨论】:

【参考方案6】:

您是说在网页中插入指向恰好具有 .exe 扩展名的文件的链接时遇到问题?

如果是这样,那就退后一步。假设该文件具有 .htm 扩展名或 .css 扩展名。你怎样才能使它可下载?如果是静态链接,那么答案很明确:该文件需要位于 ASP.NET 应用程序的 docroot 中。 IIS + ASP.NET 提供多种内容:.htm 文件、.css 文件、.js 文件、图像文件,隐式。所有这些文件都在 docroot 下,默认情况下是 c:\inetpub\wwwroot,但对于你的 webapp 来说肯定是不同的。您要公开的文件具有 .exe 扩展名这一事实不会改变 IIS 物理的基本定律。 exe 必须位于 docroot 下。网络共享可能适用于某些浏览器。

当然,另一种选择是将文件的内容动态地直接写入 Response.OutputStream。这样您就不需要 .exe 在您的 docroot 中,但它不是直接下载链接。在这种情况下,可以通过单击按钮下载文件。

类似这样的:

    Response.Clear(); 
    string FullPathFilename = "\\\\server\\share\\CorpApp1.exe";
    string archiveName= System.IO.Path.GetFileName(FullPathFilename);
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("content-disposition", "filename=" + archiveName);
    Response.TransmitFile(FullPathFilename);
    Response.End();

【讨论】:

是的,非常好的答案,感谢您提醒我。但是,EXE 从其加载文件夹加载配置设置,因此我必须重写以从网站配置加载。 另一种方法是将实际应用程序连同其配置文件和它需要的任何其他内容打包在一个自解压 zip 存档 (SFX) 中,然后下载该文件。 SFX 可以指定一个execute-after-unpack 命令,它可以是解压文件的命令。然后它将能够正常加载其.config。当然,问题在于你会切断电源线。您无法集中更新配置。一旦它被复制到用户的 HD 上,它就会一直存在。 ps:DotNetZip 是一个(免费的).NET 库,它允许创建自解压档案,并带有解压后执行命令。您可以在 ASP.NET 页面的执行过程中动态创建 SFX,然后使用 TransmitFile() 将其下载到用户的 HD。【参考方案7】:

怎么样:

<a href="\\DangerServer\Downloads\MyVirusArchive.exe" 
  type="application/octet-stream">Don't download this file!</a>

【讨论】:

-1 -- 每次都会下载 exe。每次都需要下载和安装步骤。但问题是如何运行已经在用户机器上的 exe。一壶完全不同的鱼。 @Larry:我认为你的解释是错误的。在我看来,OP 是说可执行文件是由他们(可能是组织中的特定部门)生成的,需要可供整个组织下载和后续执行。 如果您希望在用户单击网页上的链接或按钮时在用户桌面上启动应用程序,并且您的桌面应用程序位于 .NET 中,那么您可能需要考虑使用 ClickOnce 进行部署应用程序。 ClickOnce 将减轻在这个庄园分发应用程序的痛苦。 -1:当我看到您可以从 TFS Web 界面打开一个新的 Visual Studio 实例时,我就到了这里。问题不在于如何下载 EXE,而在于如何启动已安装的程序。 一点都不好笑。 OP 所要求的实际上是 Intranet Web 应用程序中非常常见的用例【参考方案8】:

你试过UNC share吗?

\\server\share\foo.exe

【讨论】:

以上是关于如何从网页 (asp.net) 启动 EXE的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 和 ASP.NET 从网页中截取 div?

从 asp.net 扫描图像

将标签字段添加到 asp.net 网页

如何从 Asp.NET Core 3.1 启动类访问 launchSettings.json 中的 `applicationUrl` 属性?

处理 ASP.NET 中长时间运行的进程

从 ASP.NET 将网页转换为图像