System.Diagnostics.Process.Start在IIS中无法工作

24

当我在控制台应用程序中运行System.Diagnostics.Process.Start时它可以正常工作,但是当我从托管在IIS中的Web服务中运行相同的代码时却无法正常工作。

这是不是与ASP.Net权限有关?如果是,如何从我的C#代码中进行配置。


这个答案解决了我的问题,而且不需要去操作IIS:https://dev59.com/questions/EXRB5IYBdhLWcg3wQVSV#43610982 - Thor
6个回答

21

ASP.NET网页和服务器控件代码在Web服务器的ASP.NET工作进程上下文中执行。如果您在ASP.NET网页或服务器控件中使用Start方法,则新进程以受限权限在Web服务器上执行。该进程不会在客户端浏览器相同的上下文中启动,并且无法访问用户桌面。 http://msdn.microsoft.com/en-us/library/0w4h05yb.aspx

- 允许ASP.NET工作进程帐户与桌面交互

或允许ASP.NET工作进程在SYSTEM帐户中运行。

- 启用IIS管理服务与桌面交互

按照以下步骤进行配置:

  • a. 打开控制面板并执行以下步骤: 对于Windows NT:单击“服务”。 对于Windows 2000、Windows XP和.NET Server:单击“管理工具”,然后单击“服务”。

  • b. 双击“IIS管理服务”。

  • c. 在“登录”选项卡上,选择“允许服务与桌面交互”复选框。 记得将IIS管理服务作为本地系统运行。
  • d. 停止并重新启动IIS管理服务。

我按照您的指示操作,但是在Windows服务器上无法运行exe文件。由于没有任何异常信息表明exe文件未能启动,是否有任何方法可以记录错误问题? - embarus
2
新进程在Web服务器上以受限权限执行。好的,但是使用哪个账户?单词“受限”代表什么意思? - Royi Namir
我按照Tim Schmelter和Ravi Ram的建议进行了更改,不知道哪一个起作用了。别忘了重新启动IIS,例如iisreset /noforce。 - Pratap Singh Mehra

8

我尝试了更改应用程序池,解决了问题。

  1. 进入IIS > 应用程序池
  2. 选择相应网站的高级设置
  3. 将身份更改为LocalSystem
  4. 重启IIS

图片描述


3
重启IIS CMD > iisreset /noforce - Pratap Singh Mehra
在 Windows Server 2019 上,这是对我有效的方法...谢谢。 - Prince Tegaton

2

我曾尝试过其他解决方案,但对我没有用。我需要的是,一个命令应该通过Windows命令提示符以管理员身份运行。 以下是未能执行的代码:

Process sysProcess = new Process();
sysProcess.StartInfo.FileName = "cmd.exe";
sysProcess.StartInfo.Verb = "runas";
sysProcess.StartInfo.CreateNoWindow = true;
sysProcess.StartInfo.RedirectStandardInput = true;
sysProcess.StartInfo.RedirectStandardOutput = true;
sysProcess.StartInfo.RedirectStandardError = true;
sysProcess.StartInfo.UseShellExecute = false;
sysProcess.Start();
sysProcess.StandardInput.WriteLine("cal.exe");
sysProcess.StandardInput.Flush();
sysProcess.StandardInput.Close();
//localProcess.WaitForExit();
sysProcess.StandardOutput.ReadToEnd();

解决方案: 这是一个API项目,当我从项目属性和调试选项卡中启用SSL时(请参见图1和图2),问题得到解决。
图1: Visual Studio 2019 enter image description here 图2: Visual Studio 2022 enter image description here 这个解决方案适用于任何Web应用程序项目。

2
我遇到了类似的问题,从服务访问桌面的能力不是问题。当不模拟其他用户时,它可以正常工作,但是在尝试以不同的用户身份运行进程时失败了。 当它无法启动时,首先要做的是尽可能了解有关问题的所有信息。第一个问题是Process.Start是否返回了true或false。其次,在尝试启动进程时是否收到任何类型的异常。
在您完全调查之前,必须知道Process.Start是否使用UseShellExecute运行-这必须为false以进行模拟,但否则您可以选择使用它,并且它会根据此设置调用不同的Win32函数。
如果您正在进行需要以另一个用户身份运行的过程,则不要尝试使用.NET模拟 - 您需要设置StartInfo用户名、密码、域。但是,在IIS下,您还需要进行一些额外的锁定,并且我在Windows Server 2008上找到的唯一解决方案实际上涉及一些Win32调用和抽象安全库的实现。您可能遇到的许多情况在此处概述:http://asprosys.blogspot.co.uk/2009/03/perils-and-pitfalls-of-launching.html 该页面的示例代码显示了如何调用库并向用户添加Windows Station和Desktop访问权限,然后以该用户的身份启动进程。这就是我需要从IIS中启动Process.Start的方法,已排除UAC、DEP和我能想到的任何其他三个字母缩写的可能性 ;)

0

如果您的应用程序正在运行Windows 7,则无法进行通信。基本上,服务运行会话0,用户桌面运行会话1,因此您无法从会话0通信到会话1。即使您尝试从Win登录进程(用于为每个新用户启动用户会话)进行通信,也无法获取某些本地信息(例如浏览器设置,如本地存储信息)。


-2

对我而言,像这样的代码是有效的:

ProcessStartInfo psi = new ProcessStartInfo();
psi.UseShellExecute = true;
psi.LoadUserProfile = true;
psi.WorkingDirectory = sender.Server.MapPath("../");// This line solved my problem
psi.FileName = sender.Server.MapPath("../myexecutable.exe");
psi.Arguments = "Myargument1 Myargument2";
Process.Start(psi);

`


1
仅仅提供一个工作路径,并不能帮助进程与桌面交互。 - Robert Koernke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接