在桌面会话中从IIS运行进程/URI

本文关键字:运行 进程 URI IIS 桌面 会话 | 更新日期: 2023-09-27 18:04:11

我有一个ASP。. NET web应用程序在IIS中运行。应用程序池和web应用程序都设置为作为我创建的用户运行(而不是NETWORKSERVICE)。此用户具有所有适当的权限(类似于伪管理员)。

应用程序使用磁铁URI调用Process.Start()。在web服务器上安装了一个应用程序,它可以自动启动并开始处理磁铁URI。如果我将磁铁URI输入到web服务器的"运行"框中,一切都如预期的那样工作:应用程序启动并开始在后台处理URI。如果我在Visual Studio中调试应用程序,也会发生同样的情况-它按预期工作,因为IIS Express实例也在同一会话中运行。

当我从我的web应用程序中调用进程时,当它在IIS中,虽然,它不会抛出任何异常或错误,但它不会调用应用程序。我假设这是因为IIS在应用程序所在的另一个会话中执行应用程序,所以应用程序无法响应URI调用,所以进程就退出了。

如何更改这行代码,使其在与桌面会话相同的上下文中运行,以便应用程序可以适当地响应和处理URI ?

Process.Start("magnet:?xt=urn:btih:0123456789ABCDEF");

如果桌面会话不存在(例如,用户没有登录到服务器),我希望抛出某种可捕获的异常,以便在网站上显示友好的错误。

在桌面会话中从IIS运行进程/URI

ASP。的上下文中执行。NET网页和服务器控件代码ASP。Web服务器上的。NET工作进程。如果你使用Start方法。. NET网页或服务器控件,新建进程在具有受限权限的Web服务器上执行。这个过程不在与客户端浏览器相同的上下文中启动,并且没有能够访问用户桌面。http://msdn.microsoft.com/de-de/library/e8zac0ca.aspx

当你使用Process。从iis7 +开始,它会在"会话0"中启动一个新的进程作为服务,即使你在服务器上使用相同的帐户登录,你也不能与该会话进行任何交互。但是,您可以在任务管理器中看到正在运行的进程(显示来自所有用户的进程)。

如果没有关联磁体链接,则可以将磁体链接作为参数传递

Process.Start("C:'...'Torrent.exe", "magnet:?...")

如果相关的exe进程根本没有启动-重定向其输出(示例)并查看问题所在

一般来说,从web应用程序运行外部进程不是一个好主意,你可以考虑调度任务或Windows服务轮询一个公共存储库,看看是否应该运行批处理作业,并从那里执行你的应用程序。

的例子:

  1. 使用aspx将"magnet:?xt=…"写入文本文件(c:'magnet.txt)
  2. 创建一个.bat文件,内容如下

    FOR /F %%x IN (c:''magnet.txt) DO START %%x
    DEL /F c:'magnet.txt
    
  3. 创建一个打开.bat文件的计划任务,例如每分钟

完成了!

您可以尝试在服务器上创建一个专用的常规用户帐户,然后使用

Process.Start(fileName, userName, password, domain)

在该用户凭据下启动进程。

另一个想法,创建一个自托管的WCF服务,并在登录的桌面用户会话下运行它。WCF服务将启动您的"magnet:"应用程序。从ASP中调用WCF服务。. NET代码(通过localhost).

尝试使用CreateProcessWithLogonW代替Process.Start()。类似的问题在SO中回答:Process.Start() under asp.net?