【问题标题】:Can't run exe from classic ASP script on IIS 7.5无法从 IIS 7.5 上的经典 ASP 脚本运行 exe
【发布时间】:2013-11-06 19:40:08
【问题描述】:

我正在尝试将现有系统从 Windows XP Professional/IIS 5.1 升级到 Windows 7 Ultimate(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 中可能实现相同预期最终结果的其他选项。

【问题讨论】:

    标签: asp-classic iis-7.5


    【解决方案1】:

    您将无法使用 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 是采用新架构的自下而上重写。

    一种可能的解决方法是编写一个简单的 WCF 服务,其 HTTP 端点在用户登录时启动(托管在 Windows 应用程序中,该应用程序将自身隐藏或最小化到通知区域)。然后,您可以使用 MSXML2.ServerXMLHttp 之类的方式从经典 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)

    引用:

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

    在交互式窗口站中放置守护程序的简单方法 (WinSta0) 所以它可以有自己的用户界面是把它打包成一个 以SYSTEM 运行的服务并选中“允许 服务与桌面交互。”这告诉 SCM 启动 您在SYSTEM 登录会话(WhatIsALogonSession)中的服务进程 并将您的流程附加到WinSta0 而不是非交互式 SYSTEM 守护进程正常运行的窗口站, Service-0x0-0x3e7$.

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

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

    这基本上是我所建议的。

    【讨论】:

    • 感谢您的意见。您已经证实了我的怀疑,即无法按原样在 IIS 7.5 上运行。至于 WCF 服务,它似乎确实可以作为一种解决方案,但我认为我们不会采取这种方式。此时,如果要进行任何编码更改,将其转换为 Windows 应用程序会更实用。现在,它是 XP!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多