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

C# 在桌面会话中从IIS运行进程/URI,c#,asp.net,iis,process,uri,C#,Asp.net,Iis,Process,Uri,我有一个ASP.NET web应用程序在IIS中运行。应用程序池和web应用程序都设置为以我创建的用户身份运行(不是NETWORKSERVICE)。此用户拥有所有正确的权限(如伪管理员) 应用程序使用磁铁URI调用Process.Start()。Web服务器上安装了一个应用程序,可以自动启动并开始处理磁铁URI。如果我在Web服务器的“运行”框中输入magnetic URI,那么一切都会按预期进行:应用程序启动并开始在后台处理URI。如果我在Visual Studio中调试应用程序,也会发生同样

我有一个ASP.NET web应用程序在IIS中运行。应用程序池和web应用程序都设置为以我创建的用户身份运行(不是NETWORKSERVICE)。此用户拥有所有正确的权限(如伪管理员)

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

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

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

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

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

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

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


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

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

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

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

ASP.NET网页和服务器控制代码在的上下文中执行 Web服务器上的ASP.NET工作进程。如果你用启动键 方法在ASP.NET网页或服务器控件中创建新进程 在具有受限权限的Web服务器上执行。过程 不会在与客户端浏览器相同的上下文中启动,也不会 可以访问用户桌面

当您在IIS 7+上使用Process.Start时,它将在中作为服务启动一个新进程,即使您使用相同的帐户登录服务器,您也无法与该会话进行任何交互。但是,您可以在任务管理器中看到正在运行的流程(显示来自所有用户的流程)

如果磁铁链接没有关联,那么可以将磁铁链接作为参数传递

Process.Start("C:\...\Torrent.exe", "magnet:?...")
如果关联的exe进程根本没有启动,请重定向其输出()并查看问题所在

一般来说,从Web应用程序运行外部进程不是一个好主意,您可以考虑一个计划任务或Windows服务,轮询一个公共存储库,以查看批作业是否应该运行并从那里执行应用程序。p> 例如:

  • 使用aspx将“magnet:?xt=…”写入文本文件(c:\magnet.txt)
  • 创建一个包含以下内容的.bat文件

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

  • 完成了

    ASP.NET网页和服务器控制代码在的上下文中执行 Web服务器上的ASP.NET工作进程。如果你用启动键 方法在ASP.NET网页或服务器控件中创建新进程 在具有受限权限的Web服务器上执行。过程 不会在与客户端浏览器相同的上下文中启动,也不会 可以访问用户桌面

    当您在IIS 7+上使用Process.Start时,它将在中作为服务启动一个新进程,即使您使用相同的帐户登录服务器,您也无法与该会话进行任何交互。但是,您可以在任务管理器中看到正在运行的流程(显示来自所有用户的流程)

    如果磁铁链接没有关联,那么可以将磁铁链接作为参数传递

    Process.Start("C:\...\Torrent.exe", "magnet:?...")
    
    如果关联的exe进程根本没有启动,请重定向其输出()并查看问题所在

    一般来说,从Web应用程序运行外部进程不是一个好主意,您可以考虑一个计划任务或Windows服务,轮询一个公共存储库,以查看批作业是否应该运行并从那里执行应用程序。p> 例如:

  • 使用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()尝试使用CreateProcessWithLogonW。 在SO中回答了类似的问题:

    而不是Process.Start()尝试使用CreateProcessWithLogonW。
    在SO中回答了类似的问题:

    您可能会在事件日志中找到一些东西来解释出现了什么问题。关于从服务访问桌面的信息,一个类似的问题是。由于这是一件危险的事情(正如你可以想象的,并不是每个人都希望每个人都能从web客户端启动桌面应用程序…),所以设置起来可能会非常困难。另外,您正试图调用集成到Windows Shell(在Magnetor uri后面)的东西,这增加了诊断的复杂性(通常Shell会吃掉所有错误,以免干扰最终用户…)。第一件事:能否使用.exe路径而不是uri启动应用程序?赫尔