如何找出进程退出的原因以及如何阻止它退出

时间:2012-01-31 12:32:04

标签: c# process

以下代码位于WIndows Vista上的Windows服务中托管的WCF服务中。我正在尝试使用System.Diagnostics.Process.Start()启动进程。

            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.FileName = ConfigurationManager.AppSettings["ApplicationPath"];
            proc.StartInfo.UseShellExecute = false; 
            proc.StartInfo.CreateNoWindow = false; 
            proc.StartInfo.RedirectStandardOutput = true; 
            proc.StartInfo.RedirectStandardError = true;
            proc.EnableRaisingEvents = true;
            proc.Exited += new EventHandler(proc_Exited);
            proc.Start();//ConfigurationManager.AppSettings["ApplicationPath"]);

在调用start之后,当我尝试访问进程的Name时,它会抛出InvalidOperationException,表示进程已退出。

我尝试处理Exit事件 -

private void proc_Exited(object sender,System.EventArgs e)         {

        if (proc.ExitTime != null)
        {
            General.WriteLogEntry("TIME " + proc.ExitTime );
        }
        if (proc.ExitCode != null)
        {
            General.WriteLogEntry("EXITCODE " + proc.ExitCode );//+ " " + proc.Handle);
        }
        if (proc.Handle != null)
        {
            General.WriteLogEntry("HANDLE" + " " + " " + proc.Handle);
        }
        if (proc.StandardError != null)
        {

            using (var str = proc.StandardError)
            {
                string k = str.ReadToEnd();
                General.WriteLogEntry("stderr - " + k);
            }
        }
    }

但我无法获得有关该流程退出原因的任何信息。 StandardError没有信息。我想让这个过程运行..任何想法都会很棒。

编辑1:

这个过程似乎有足够的权利。当我以管理员身份登录时,我可以从UI启动它。此外,

  1. (WindowsPrincipal)Thread.CurrentPrincipal.Identity.Name.ToString()是NT AUTHORITY \ SYSTEM。
  2. System.Security.Principal.WindowsIdentity.GetCurrent()。Name.ToString()是我用来登录此计算机的系统管理员帐户。
  3. System.Environment.UserName.ToString()是SYSTEM。
  4. 我觉得安全是这里的问题..........你如何确保两者:

    1. 要启动的流程,
    2. 启动流程的代码
    3. 拥有足够的特权。


      编辑2: 当我使用本地机器进行测试时,相同的代码就会出现问题。这是我在本地的方式:我有2个Visual Studio运行实例。一个具有WCF客户端和另一个WCF服务。我从服务应用程序启动Windows窗体,在其button_click处理程序中,我通过netTcp托管我的WCF服务。然后我使用WCF客户端来调用该服务。 WCF客户端最终调用上面的代码,并且能够启动该进程。

0 个答案:

没有答案