2016-11-12 2 views
0

Я создаю службу Windows, которая работает рука об руку с другими приложениями. Эти приложения начинают связь с сервисом VIA Remoting. После того, как соединение было сделано, я хочу, чтобы приложения немедленно прекратили связь, если служба остановлена. Это означает, что я не хочу ждать окончания таймера или иметь исключение, потому что связь пыталась использовать IpcConnection, которая больше не действительна.Как WaitForExit() для внешнего процесса (службы)

Это все работает, когда служба работает Интерактивно, а не как служба. Когда он запускается как служба, я получаю исключение. Служба запускается как Admin, независимо от того, запущена ли она как служба или Интерактивно. Если я запустил другое приложение в качестве администратора, то он работает так, как ожидалось. К сожалению, запуск этого приложения в качестве администратора не будет вариантом в производстве.

Я сузил его до того, что вызывает исключение.

var serverProc = Process.GetProcessById(_remote.ProcessId); 
serverProc.WaitForExit(); 

serverProc успешно, но WaitForExit терпит неудачу.

System.ComponentModel.Win32Exception (0x80004005): Access is denied 
    at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited) 
    at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) 
    at System.Diagnostics.Process.WaitForExit(Int32 milliseconds) 

я могу заменить этот код с Timer, но я надеялся, что этот ток техника будет работать.

Я что-то делаю, и есть ли что-то, что я могу сделать, чтобы избежать исключения и использовать аналогичный код?

+0

Это совершенно нормально. Вам нужно будет прагматично, вы не можете изменить способ работы класса Process. И это, безусловно, нужно начинать с того, что ваш сервис попрощался красиво, поэтому вам не нужно искать трудный путь. Все равно не будет работать, когда он умрет от тяжелого крушения. Но что-то исключительное произошло, оно должно вызвать исключение. –

ответ

0

Очень вероятно, что ваши службы работают как другой пользователь (возможно, LocalSystem). Также весьма вероятно, что ваше приложение работает как ваш текущий пользователь, а не как администратор.

Неадминистративные процессы не могут запрашивать некоторые аспекты процессов другими пользователями. Вы можете попробовать запустить приложение в качестве администратора, чтобы убедиться, что это ваша проблема: попробуйте щелкнуть правой кнопкой мыши на вашем исполняемом файле и выбрать «Запуск от имени администратора», который будет запрашивать диалоговое окно «Контроль доступа пользователя», а затем должен работать без проблем.

Предполагая, что работает, вы можете использовать этот вопрос, чтобы сделать ваше приложение всегда требует, чтобы разрешение: How do I force my .NET application to run as administrator?

Смежные вопросы