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

这是一个内部Web应用程序,我们希望Web页面包含指向Win32 EXE的几个实用程序的链接。 EXE是我们信任和生产的。 (不关心它是否问好,是否运行或保存)。 我尝试直接链接(例如C:\ notepad.exe),只在本地工作。 (这将是一个在networking上的份额)。 试过的文件:/ /并没有工作。 IE7是浏览器所需要的。

感觉如何?

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

这假定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方法(Windows脚本主机) 。

您可以看到iTunes如何使用Fiddler在使用链接时遵循操作: http : //phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=80028216

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

请注意,该exe文件在安装时安装了URL协议处理程序,用于浏览器的“itms”传输。

不是一个简单的工程项目来复制,但肯定是可以的。 如果你继续这样做,请考虑做相关的软件开源。

在Windows中,指定的应用程序协议可以在registry中注册。 在这个msdn文档显示注册一个应用程序到一个URIscheme。

例如,将启动一个可执行文件'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来testing

 <head> <title>alter</title> </head> <body> <a href="alert:" >alert</a> <body> 

作为Larry Kbuild议的解决scheme的一部分,注册自己的协议可能是一个可能的解决scheme。 该网页可能包含一个简单的链接来下载和安装应用程序 – 然后它将在Windowsregistry中注册自己的协议。

然后,网页将包含带有参数的链接,这些参数将导致注册程序被打开,并且链接中指定的任何参数被传递给它。 有一个很好的描述如何在MSDN上做到这一点

你试过一个UNC份额吗?

\\server\share\foo.exe

你是说你在插入一个网页的时候遇到了遇到扩展名为.exe的文件的链接问题吗?

如果是这样,那就退一步。 想象一下这个文件有一个.htm扩展名或者一个.css扩展名。 你怎样才能下载? 如果它是一个静态链接,那么答案很清楚:该文件需要位于ASP.NET应用程序的docroot中。 IIS + ASP.NET提供多种内容:.htm文件,.css文件,.js文件,图像文件, 隐式地提供 。 所有这些文件都在docroot下,默认情况下是c:\ inetpub \ wwwroot,但是对于你的web应用程序来说肯定是不同的。 您要公开的文件具有.exe扩展名的事实不会更改IIS物理的基本法则。 exe文件必须在文件根目录下。 networking共享的东西可能适用于某些浏览器。

当然,替代方法是将文件的内容直接写入到Response.OutputStream中。 这样你就不需要将.exe放在你的文档根目录下,但它不是一个直接的下载链接。 在这种情况下,文件可能通过点击button下载。

像这样的东西:

  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(); 

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

你也可以使用Javascript 。

或者您可以注册一个应用程序来处理您可以定义的新的Web协议 。 这也可能是一个“应用程序select”协议,所以每次点击一个应用程序链接到您的新协议的页面,所有处理这个协议然后传递给您的“select应用程序”,使用参数来查找和启动客户端PC上的应用程序。

HTH