【问题标题】:Is there a way to use IIS to trigger a desktop application to open the GUI for the current user?有没有办法使用 IIS 触发桌面应用程序为当前用户打开 GUI?
【发布时间】:2015-11-20 15:10:30
【问题描述】:

TL;DR:需要允许 IIS (7-7.5) Web 服务以当前用户打开 Internet Explorer 并使其可见。 (允许与桌面交互)

这是我尝试过的问题和方法:

我在一所大学工作,整个学校都有监控器。这些监视器只是带有以信息亭模式打开的 Web 浏览器的 Windows 服务器。

他们与之交互的服务器会不时出现故障,并且网络浏览器(每 2 分钟刷新一次)可能会卡在不良状态。

当页面没有正确刷新时,我有一种方法可以监控(使用第二台服务器,nagios),简单的解决方案是刷新浏览器或(更简单)再次打开并关闭它。

我需要远程服务器 (nagios) 来触发 Web 浏览器通过 Web Api 调用进行刷新。我在服务器上设置了 IIS,编写了一个简单的 Web 服务,如下所示:

closeAllProcessesWithNameIE();
Process.Start("Iexplorer", -k"); 

所有 IE 实例将正常关闭,并且 IE 进程将再次启动(可以在任务管理器中看到)。 但是 IE 的 GUI 不会显示。

我尝试过的事情(在所有排列中):

  1. 使应用程序池以当前登录用户身份运行。
  2. 触发二级程序运行IE,包括自定义EXE、bat和Powershell脚本。
  3. 为万维网发布服务启用了“允许服务与桌面交互”。 (记住 IIS 7 没有 IISADMINSERVICE 这是 IIS6 的功能)
  4. USER32.dll 各种功能使窗口出现在顶部。

我正在考虑编写一个用任务调度程序检查的信号量/锁定文件,但这似乎比最初的解决方案更hacky。

我不担心的事情:

  1. 远程代码执行。
  2. 入侵登录的用户帐户。 (这些帐户甚至本地管理员都没有任何权限)
  3. 有人不断重启网络浏览器(我们通过 HTTPS 使用基本身份验证令牌)

【问题讨论】:

  • 新进程可能是在 IIS 服务帐户下启动的,而不是交互式用户帐户。就个人而言,我会编写一个在用户帐户上运行的小实用程序,以确保 IE 正在运行(每 X 秒检查一次),如果没有,则启动它。 web api调用可以杀死它,实用程序可以在正确的帐户下再次启动它。
  • IIS 实际上是在当前登录使用下运行的(为该使用配置了 APP 池) IE 也以该用户身份打开。不过,另一个想法可能是实现信号量(锁定文件)的更简单方法“IE 正在运行,不!重新打开它!
  • 用户相同,并不意味着它在交互式会话中......
  • 不是。无论如何我可以在不同的会话中打开一个进程吗?

标签: c# .net internet-explorer iis asp.net-web-api


【解决方案1】:

使用 PsExec,您可以使用 -i 开关指定您希望启动的应用程序附加到当前交互式会话。

PsExec download site

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多