System.Diagnostics.Process.Start 不能从 IIS 工作

Posted

技术标签:

【中文标题】System.Diagnostics.Process.Start 不能从 IIS 工作【英文标题】:System.Diagnostics.Process.Start not work from an IIS 【发布时间】:2011-01-13 11:32:53 【问题描述】:

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

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

【问题讨论】:

这个答案为我解决了它,而无需弄乱 IIS:***.com/a/43610982/6479268 【参考方案1】:

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

- 授予 ASP.NET 工作进程帐户权限

与桌面交互或允许 ASP.NET 工作进程在 SYSTEM 帐户中运行。

了解如何允许工作进程在 SYSTEM 帐户中运行 要了解 ASPNET 帐户的默认权限,请查看本文 信息:在 ASP.NET 中处理和请求身份:http://support.microsoft.com/default.aspx?scid=kb;en-us;317012

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

要进行配置,请按照以下步骤操作。

一个。打开控制面板并按照以下步骤操作: 对于 Windows NT:单击服务。 对于 Windows 2000、Windows XP 和 .NET Server:单击管理工具,然后单击服务。

b.双击 IIS 管理服务。

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

【讨论】:

我按照您的指示进行操作,但无法在 Windows 服务器上运行 exe。有没有办法记录错误问题,因为不启动 exe 也不例外。 新进程在具有受限权限的 Web 服务器上执行 ok。但在哪个账户下? “受限”这个词代表什么? 我做了 Tim Schmelter 和 Ravi Ram 规定的更改。不知道哪个有效。不要忘记重新启动 IIS。像 iisreset /noforce【参考方案2】:

更改 AppPool 对我有用。

    IIS > 应用程序池 为网站选择高级设置 将身份更改为 LocalSystem 重启 IIS

【讨论】:

重启 IIS CMD > iisreset /noforce 在 Windows Server 2019 上 -- 这对我有用.. 谢谢【参考方案3】:

我遇到了类似的问题,从服务访问桌面的能力不是问题。它在不冒充另一个用户时工作正常,但是当尝试以其他用户身份运行该进程时它失败了。 当它无法启动时,要做的第一件事就是找出有关该问题的所有信息。第一个问题是 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 和我能想到的任何其他三字母缩写词;)

【讨论】:

【参考方案4】:

我尝试过上层解决方案,但对我不起作用。我需要的是,一个命令应该通过 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

图 2: Visual Studio 2022

此解决方案适用于任何 Web 应用项目。

【讨论】:

【参考方案5】:

如果您的应用程序正在运行 Windows 7,那么您不能。基本上是运行会话 0 的服务和运行会话 1 的用户桌面,因此您无法从会话 0 到会话 1 进行通信。即使您尝试从 win 登录进程(用于为每个新用户启动用户会话)进行通信,您也可以't get some local information(浏览器设置,如本地存储信息)

【讨论】:

【参考方案6】:

对我来说,工作是这样的:

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);

`

【讨论】:

仅仅放置一个工作路径,不会帮助进程与桌面交互。

以上是关于System.Diagnostics.Process.Start 不能从 IIS 工作的主要内容,如果未能解决你的问题,请参考以下文章