我在IIS中运行了一个ASP.NET Web应用程序。应用程序池和Web应用程序都设置为以我创建的用户身份运行(而不是NETWORKSERVICE)。此用户具有所有适当的权限(如伪管理员)。
应用程序使用磁铁URI调用Process.Start()
。 Web服务器上安装了一个应用程序,可以自动启动并开始处理磁体URI。如果我将磁体URI输入到网络服务器的“运行”框中,一切都按预期工作:应用程序启动并开始在后台处理URI。如果我从Visual Studio中调试应用程序,也会发生同样的情况 - 它按预期工作,因为IIS Express实例也在同一会话中运行。
当我在我的Web应用程序中调用该进程时,它在IIS中,它不会抛出任何异常或错误,但它不会调用该应用程序。我假设这是因为IIS正在从应用程序所在的不同会话中执行应用程序,因此应用程序无法响应URI调用,因此该进程将退出。
如何更改此行代码以在与桌面会话相同的上下文中运行,以便应用程序可以适当地响应和处理URI?
Process.Start("magnet:?xt=urn:btih:0123456789ABCDEF");
如果桌面会话不存在(例如该用户尚未登录服务器),我会期望抛出某种可捕获的异常,以便在网站上显示友好错误。
答案 0 :(得分:1)
您可以尝试在服务器上创建专用的常规用户帐户,然后使用
Process.Start(fileName, userName, password, domain)
以该用户凭据开始您的流程。
另一个想法是,创建一个自托管的WCF服务,并在登录的桌面用户会话下运行它。 WCF服务将启动你的磁铁:"应用程序。从ASP.NET代码中调用WCF服务(通过localhost
)。
答案 1 :(得分:1)
ASP.NET网页和服务器控制代码在上下文中执行 Web服务器上的ASP.NET辅助进程。如果您使用“开始” ASP.NET网页或服务器控件中的方法,新进程 在具有受限权限的Web服务器上执行。这个过程 不会在与客户端浏览器相同的上下文中启动,也不会 有权访问用户桌面。 http://msdn.microsoft.com/de-de/library/e8zac0ca.aspx
在IIS 7+上使用Process.Start时,它会在'Session 0'中作为服务启动一个新进程,即使您将使用相同的帐户登录,也无法与该会话进行任何交互。服务器。但是,您可以在任务管理器中看到正在运行的进程(显示所有用户的进程)。
如果没有关联磁力链接,那么您可以将磁力链接作为参数传递
Process.Start("C:\...\Torrent.exe", "magnet:?...")
如果相关exe的进程根本没有开始 - 重定向其输出(example)并查看问题所在。
通常,从Web应用程序运行外部进程并不是一个好主意,您可以考虑使用Scheduled Task或Windows Service来轮询公共存储库以查看是否应该运行批处理作业并从那里执行您的应用程序。
示例:
使用以下内容创建.bat文件
FOR /F %%x IN (c:\\magnet.txt) DO START %%x
DEL /F c:\magnet.txt
创建一个打开.bat文件的计划任务,例如每分钟
完成!
答案 2 :(得分:0)
而不是Process.Start()尝试使用CreateProcessWithLogonW。 在SO中回答了类似的问题:Process.Start() under asp.net?