Приведенный ниже код находится в службе 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:
Кажется, у процесса достаточно прав. Когда я вхожу в систему как администратор, я могу запустить его из пользовательского интерфейса. Кроме того,
- (WindowsPrincipal) Thread.CurrentPrincipal.Identity.Name.ToString () является NT AUTHORITY \ SYSTEM.
- System.Security.Principal.WindowsIdentity.GetCurrent (). Name.ToString () - это учетная запись системного администратора, которую я использую для входа на этот компьютер.
- System.Environment.UserName.ToString () - это СИСТЕМА.
Я чувствую, что проблема в безопасности .......... Как вы гарантируете, что оба:
- процесс, который нужно запустить, и,
- код, запускающий процесс
имеют достаточные привилегии.
РЕДАКТИРОВАТЬ 2:
Тот же код работает, когда я использую свою локальную машину для тестирования. Вот как я делаю это локально: у меня работает 2 экземпляра Visual Studio. Один имеет клиента WCF, а другой - сервис WCF. Я запускаю форму Windows из приложения-службы и в ее обработчике button_click размещаю службу WCF через netTcp. Затем я использую клиент WCF для вызова службы. Клиент WCF в конечном итоге вызывает вышеуказанный код и может запустить процесс.