Как узнать, почему процесс завершился и как остановить его - PullRequest
0 голосов
/ 31 января 2012

Приведенный ниже код находится в службе WCF, размещенной в службе Windows в Windows Vista. Я пытаюсь запустить процесс с помощью 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, когда я пытаюсь получить доступ к имени процесса, выдается исключение InvalidOperationException, сообщающее, что процесс завершен.

Я пытаюсь обработать событие Exit-

private void proc_Exited (отправитель объекта, 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);
            }
        }
    }

Но я не могу получить информацию о том, почему процесс завершился. Стандартная ошибка не имеет информации. Я хотел бы запустить этот процесс .. Любые идеи были бы потрясающими.

РЕДАКТИРОВАТЬ 1:

Кажется, у процесса достаточно прав. Когда я вхожу в систему как администратор, я могу запустить его из пользовательского интерфейса. Кроме того,

  1. (WindowsPrincipal) Thread.CurrentPrincipal.Identity.Name.ToString () является NT AUTHORITY \ SYSTEM.
  2. System.Security.Principal.WindowsIdentity.GetCurrent (). Name.ToString () - это учетная запись системного администратора, которую я использую для входа на этот компьютер.
  3. System.Environment.UserName.ToString () - это СИСТЕМА.

Я чувствую, что проблема в безопасности .......... Как вы гарантируете, что оба:

  1. процесс, который нужно запустить, и,
  2. код, запускающий процесс

имеют достаточные привилегии.


РЕДАКТИРОВАТЬ 2: Тот же код работает, когда я использую свою локальную машину для тестирования. Вот как я делаю это локально: у меня работает 2 экземпляра Visual Studio. Один имеет клиента WCF, а другой - сервис WCF. Я запускаю форму Windows из приложения-службы и в ее обработчике button_click размещаю службу WCF через netTcp. Затем я использую клиент WCF для вызова службы. Клиент WCF в конечном итоге вызывает вышеуказанный код и может запустить процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...