从ASP.NET启动流程 – 为什么流程会立即死亡?

我正在尝试从ASP.NET C#应用程序启动一个进程。 我的应用程序通过进程自己的API(这是第三方程序)与此进程通信。 我只需要在某些情况下运行此过程,因此我认为不需要在服务器上不断运行它,因此需要从我的应用程序启动该过程。

我正在使用的进程设置为通过命令行参数以“无面”模式运行,因此不需要GUI出现在任何地方。 在不放弃太多的情况下,它会对特定数据执行复杂的计算(数据从流程中的外部源中提取,并且此数据不断更新)并通过API公开结果。 我的应用程序通过传递xml格式的查询并接收类似格式的响应来与此API通信。

我遇到的问题是启动进程工作正常,但它以SYSTEM用户身份运行进程。 这是一个问题,因为我正在启动的进程已注册到特定用户,并且在以SYSTEM身份运行时以有限的“试用版”模式运行,并且我需要的API无法按预期工作。 所以我打算以该程序注册的特定用户身份运行。 但是,当我为正确的用户添加登录信息时,该过程将启动并立即退出…
我应该采取哪些具体方式吗?

这是我的代码不能正常工作:

public static bool ProcessActive() { return Process.GetProcesses().Any(p => p.ProcessName.Equals("Process", StringComparison.InvariantCultureIgnoreCase)); } public static void StopProcess() { List processExists = Process.GetProcesses().Where(p => p.ProcessName.Equals("Process", StringComparison.InvariantCultureIgnoreCase)).ToList(); foreach (Process p in processExists) { p.Kill(); } } public static bool StartProcess(bool stopIfStarted = false) { bool retVal = false; using (System.Security.SecureString password = new System.Security.SecureString()) { // Set up the variables required to run the process ProcessStartInfo pInfo = new ProcessStartInfo(@"C:\Program Files\Program\Program.exe"); pInfo.Arguments = @"-arg1 -arg2"; pInfo.WorkingDirectory = @"C:\Program Files\Program"; pInfo.UserName = "username"; pInfo.Domain = "DOMAIN"; password.AppendChar('p'); /* repeat for other password chars */ pInfo.Password = password; pInfo.UseShellExecute = false; if (System.IO.File.Exists(pInfo.FileName)) { //Check if the process is already running bool processExists = ProcessActive(); if (stopIfStarted && processExists) { StopProcess(); processExists = ProcessActive(); } //if not, start it. if (!processExists) { StatusHelper.Log("Process isn't running. Starting process..."); using (Process realProcess = Process.Start(pInfo)) { processExists = ProcessActive(); System.Threading.Thread.Sleep(1000); processExists = ProcessActive(); if (realProcess.HasExited) { // Always gets here } retVal = processExists; } } } } return retVal; } 

我从ASP .Net 4.0启动进程的方法:
1.一个实际启动过程的远程类(它在命令行中启动Adobe Reader以打印PDF)
2.系统托盘应用程序作为远程对象的主机
3.一个web服务,它在.Net 2.0下运行,在特定用户下运行,作为远程​​对象的客户端
4. ASP .Net 4.0网站调用webservice方法

当一个进程从ASP .Net启动时,它“挂起”。 我可以在任务管理器中看到它,但它什么也没做,所以这是我找到的唯一解决方案。 您可以在控制台应用程序或Windows服务中托管远程对象。 WCF将是远程处理的另一个好选择,但我还没有尝试过。

它可能无法解答您的问题,但是执行此类操作的相当强大的方法是例如安装了具有正确凭据的Windows服务并在Web服务器和服务之间进行一些通信,例如通过私人消息队列甚至某些Web API。

这样,您就不会通过为Web进程提供比实际需要更多的权限来使您自己陷入危及您机器的境地。

您可以想象,如果您在Web进程中执行的操作是可能的,则攻击有很多可能在计算机上获得提升权限。

我不知道设置进程用户权限的任何具体方法,但您可以看到立即退出的原因是否在进程本身内,例如由于权限有限而抛出exception。

使用StartInfo获取进程输出流:

 pInfo.StartInfo.RedirectStandardInput = true; pInfo.StartInfo.RedirectStandardOutput = true; pInfo.StartInfo.RedirectStandardError = true; pInfo.StartInfo.ErrorDialog = false; 

启动过程后,您可以这样阅读:

 StreamReader sOut = pInfo.StandardOutput; StreamReader sError = pInfo.StandardError; string standardResult = sOut.ReadToEnd(); string standardError = sError.ReadToEnd();