无法从IIS 7.5上的经典ASP脚本运行exe

时间:2013-11-06 19:40:09

标签: asp-classic iis-7.5

我正在尝试将现有系统从Windows XP Professional / IIS 5.1升级到Windows 7旗舰版(32位)/ IIS 7.5。原始系统运行了一个经典的ASP网站(仅适用于localhost),该网站使用“ASPExec”在本地计算机上启动桌面应用程序(.bat,.cmd,.exe等)。在Windows 7 Ultimate / IIS 7.5下,应用程序无法从ASP页面启动。

作为测试(最终目标不是启动记事本),我尝试过:

<% 
Set Executor = Server.CreateObject("ASPExec.Execute")
Executor.Application = "notepad.exe"
Executor.ShowWindow = True
strResult = Executor.ExecuteWinApp
%>

我也尝试过:

<%
Set wshell = CreateObject("WScript.Shell")
wshell.run "notepad.exe"
Set wshell = Nothing
%>

这两种方法都会导致notepad.exe显示在Windows进程列表中,但无法在桌面上启动应用程序。对于我尝试运行的任何.exe都是如此,而.bat或.cmd文件根本无法执行任何操作。

使用IIS 5.1,ASP应用程序的原始作者使用“IIS Admin”服务和“World Wide Web Publishing”服务上的“允许服务与桌面交互”选项来实现此功能。除了允许桌面交互式服务之外的所有问题,IIS 7不再使用“IIS Admin”服务,因此这不是一个选项。

我正在寻找Windows / IIS方面的解决方法或ASP中的其他选项,可能会产生相同的预期最终结果。

1 个答案:

答案 0 :(得分:5)

使用Windows 7 / IIS 7.5无法执行此操作。这工作的原因是因为您运行的是IIS5.1。回到IIS5.0 / 5.1时代,您有三种不同的流程模型:

  • 正在处理(或低隔离模式) - 每个站点都在inetinfo.exe进程内部运行
  • 池化流程 - 站点在COM +
  • 内的外部代理流程中运行
  • 进程外(或高隔离模式) - 每个站点在其自己的COM +进程内运行

您的IIS5.1实例很可能配置为在“正在处理”模式下运行,并位于SYSTEM帐户下。因为您可以将IIS服务配置为与桌面交互,并且因为您的Classic ASP脚本正在此过程中执行,所以它能够启动可执行文件并显示在桌面上。

在IIS7中,生活是不同的。您的代码将在应用程序池进程内运行,该进程根据需要进行分解。无法配置池进程(w3wp.exe)并允许它们与桌面交互,即使在本地系统帐户下运行也是如此。

与IIS6不同,您无法将IIS7配置为表现为IIS5; IIS7是一个自下而上重写的新架构。

一种可能的解决方法是使用HTTP端点编写一个简单的WCF服务,该端点在用户登录时启动(托管在隐藏或最小化自身到通知区域的Windows应用程序中)。然后,您可以使用类似MSXML2.ServerXMLHttp的内容从Classic ASP代码调用此服务,并获取WCF服务以代表您启动这些过程。

Keith Brown的“The .NET Developers Guide to Windows Security”第29章的存档副本解释了使服务应用程序与桌面交互所涉及的阴谋:

  

The .NET Developers Guide to Windows Security - chapter 29 - How to Display a User Interface from a Daemon(来源:archive.org)

引用:

  

选项一是让自己进入交互式窗口站,并且   选项二是在交互式窗口中已经有一个进程   station为您显示UI。

     

将守护进程放入交互式窗口站的简便方法   (WinSta0)因此它可以拥有自己的用户界面,将其打包为   以SYSTEM运行的服务,并选中“允许”框   服务与桌面交互。“这告诉SCM启动   您在SYSTEM登录会话中的服务流程(WhatIsALogonSession)   并将您的流程附加到WinSta0而不是非交互式   通常运行SYSTEM守护进程的窗口站,   Service-0x0-0x3e7$

这是你可能已经在你的XP盒子上。但正如我所解释的那样,没有办法配置工作进程来执行此操作,因为您无法配置“允许服务与桌面交互。”标志,即使您可以将池配置为作为本地SYSTEM帐户运行。书写的时候,这适用于Windows 2000/2003。随着Windows Vista / 2008及更高版本的出现,您可以获得UAC的额外复杂性,并且也可以通过它。

  

您应该考虑的是选项二:使用两个流程   而不只是一个。必须在交互式中启动一个过程   用户的登录会话和WinSta0。它应该包含所有用户   您需要的界面元素,它可以连接到您的守护进程   使用任何安全形式的进程间通信都很舒服   与

这基本上就是我的建议。