从ASP启动一个进程.为什么进程会立即死亡

本文关键字:进程 为什么 一个 启动 ASP | 更新日期: 2023-09-27 18:14:07

我正在尝试从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<Process> 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启动一个进程.为什么进程会立即死亡

从asp.net 4.0开始一个进程的方法:
1. 一个实际启动进程的远程类(它在命令行中启动adobereader来打印PDF)
2. 系统应用程序作为远程对象的主机
3.在。net 2.0和特定用户下运行的web服务,作为远程对象的客户端
4. asp.net 4.0网站调用webservice方法

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

这可能不能回答你的问题,但是做这类事情的一个相当健壮的方法是,例如,安装一个Windows服务,运行正确的凭据,并通过私有消息队列或甚至一些web API在web服务器和服务之间进行一些通信。

这样你就不会因为给web进程比实际需要更多的权限而危及你的机器。

你可以想象一下,如果你在web进程中所做的事情是可能的,那么攻击就有很多可能性获得机器上的提升权限。

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

使用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();