Asp classic Can';t在IIS 7.5上从经典ASP脚本运行exe

Asp classic Can';t在IIS 7.5上从经典ASP脚本运行exe,asp-classic,iis-7.5,Asp Classic,Iis 7.5,我正在尝试将现有系统从Windows XP Professional/IIS 5.1升级到Windows 7 Ultimate(32位)/IIS 7.5。原始系统运行一个经典的ASP网站(仅对本地主机可用),该网站使用“ASPExec”在本地计算机(.bat、.cmd、.exe等)上启动桌面应用程序。在Windows 7 Ultimate/IIS 7.5下,应用程序无法从ASP页面启动 作为测试(最终目标不是启动记事本),我尝试了: <% Set Executor = Server.Cr

我正在尝试将现有系统从Windows XP Professional/IIS 5.1升级到Windows 7 Ultimate(32位)/IIS 7.5。原始系统运行一个经典的ASP网站(仅对本地主机可用),该网站使用“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管理”服务和“万维网发布”服务上的“允许服务与桌面交互”选项来实现此功能。除了允许桌面交互服务之外,IIS 7不再使用“IIS管理”服务,因此这不是一个选项


我正在寻找Windows/IIS方面的解决方法,或者ASP中的另一个选项,以实现相同的预期最终结果。

您将无法使用Windows 7/IIS 7.5实现这一点。这之所以有效是因为你在运行IIS5.1。在IIS5.0/5.1的年代,您有三种不同的流程模型:

  • 进程内(或低隔离模式)-每个站点都在
    inetinfo.exe
    进程内运行
  • 池进程-站点在COM内部的外部代理进程中运行+
  • 进程外(或高隔离模式)-每个站点在其自己的COM+进程内运行
您的IIS5.1实例很可能已配置为在“进程中”模式下运行,并在
系统
帐户下运行。因为您可以将IIS服务配置为与桌面交互,并且因为您的经典ASP脚本正在该进程中执行,所以它可以启动可执行文件,并将其显示在桌面上

在IIS7中,生活是不同的。您的代码将在一个应用程序池进程中运行,该进程是按需旋转的。无法配置池进程(
w3wp.exe
)并允许它们与桌面交互,即使是在本地系统帐户下运行

与IIS6不同的是,您不能将IIS7配置为像IIS5一样运行;IIS7是一种自下而上的重写,采用了新的体系结构

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

Keith Brown的“第29章”的存档副本解释了让服务应用程序与桌面交互所涉及的阴谋:

(来源:archive.org)

引述:

选择一是进入交互式窗口站 选项二是在交互窗口中已有一个进程 站点为您显示一个用户界面

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

这是您可能已经在您的XP设备上安装的。但正如我所解释的,无法配置工作进程来完成此操作,因为您无法配置“允许服务与桌面交互”标志,即使您可以将池配置为作为本地
系统
帐户运行。在编写本书时,这适用于Windows 2000/2003。随着Windows Vista/2008及更高版本的出现,UAC的复杂性也随之增加,你也可以克服它

你应该考虑的是选项二:使用两个过程 而不仅仅是一个。必须在交互式系统中启动一个进程 用户登录会话和

WinSta0
。它应该包含所有用户 接口元素,它可以连接到守护进程 使用任何安全形式的进程间通信,您都会感到舒适 与


这基本上就是我的建议。

谢谢您的意见。您已经证实了我的猜测,即无法按原样在IIS 7.5上运行。至于WCF服务,它看起来确实可以作为一个解决方案,但我认为我们不会走这条路。在这一点上,如果要进行任何编码更改,将其转换为Windows应用程序将更为实际。现在,它是XP!