在桌面会话中从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");
如果桌面会话不存在(例如,用户没有登录到服务器),我希望抛出某种可捕获的异常,以便在网站上显示友好的错误。
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服务轮询一个公共存储库,看看是否应该运行批处理作业,并从那里执行你的应用程序。
的例子:
- 使用aspx将"magnet:?xt=…"写入文本文件(c:'magnet.txt)
创建一个.bat文件,内容如下
FOR /F %%x IN (c:''magnet.txt) DO START %%x DEL /F c:'magnet.txt
创建一个打开.bat文件的计划任务,例如每分钟
完成了!
您可以尝试在服务器上创建一个专用的常规用户帐户,然后使用
Process.Start(fileName, userName, password, domain)
在该用户凭据下启动进程。
另一个想法,创建一个自托管的WCF服务,并在登录的桌面用户会话下运行它。WCF服务将启动您的"magnet:"应用程序。从ASP中调用WCF服务。. NET代码(通过localhost
).
尝试使用CreateProcessWithLogonW代替Process.Start()。类似的问题在SO中回答:Process.Start() under asp.net?