【发布时间】: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 不会显示。
我尝试过的事情(在所有排列中):
- 使应用程序池以当前登录用户身份运行。
- 触发二级程序运行IE,包括自定义EXE、bat和Powershell脚本。
- 为万维网发布服务启用了“允许服务与桌面交互”。 (记住 IIS 7 没有 IISADMINSERVICE 这是 IIS6 的功能)
- USER32.dll 各种功能使窗口出现在顶部。
我正在考虑编写一个用任务调度程序检查的信号量/锁定文件,但这似乎比最初的解决方案更hacky。
我不担心的事情:
- 远程代码执行。
- 入侵登录的用户帐户。 (这些帐户甚至本地管理员都没有任何权限)
- 有人不断重启网络浏览器(我们通过 HTTPS 使用基本身份验证令牌)
【问题讨论】:
-
新进程可能是在 IIS 服务帐户下启动的,而不是交互式用户帐户。就个人而言,我会编写一个在用户帐户上运行的小实用程序,以确保 IE 正在运行(每 X 秒检查一次),如果没有,则启动它。 web api调用可以杀死它,实用程序可以在正确的帐户下再次启动它。
-
IIS 实际上是在当前登录使用下运行的(为该使用配置了 APP 池) IE 也以该用户身份打开。不过,另一个想法可能是实现信号量(锁定文件)的更简单方法“IE 正在运行,不!重新打开它!
-
用户相同,并不意味着它在交互式会话中......
-
不是。无论如何我可以在不同的会话中打开一个进程吗?
标签: c# .net internet-explorer iis asp.net-web-api