У меня есть служба Windows .net, работающая как локальная система. У меня есть другой процесс .net, который должен ждать завершения службы. Этот процесс не знает имя службы, поэтому он не может запросить диспетчер управления сервисом. Он знает идентификатор процесса обслуживания. Я могу изменить источники как службы Windows, так и другого процесса.Как подождать системного процесса из пользовательского процесса?
Когда я делаю:
process = Process.GetProcessById(processId);
process.WaitForExit();
из другого процесса, я получаю:
System.ComponentModel.Win32Exception: Access is denied
Stack trace:
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.WaitForExit(Int32 milliseconds)
GetProcessHandle называет OpenProcess. По-видимому, целевой процесс должен позволить SYNCHRONIZE bit работать выше, что теоретически может быть установлено SetSecurityInfo из Службы Windows. Однако, похоже, нет простого способа сделать это в .NET, чтобы не вызвать несколько pinvokes для повышения, включить привилегию и, наконец, изменить безопасность.
Я пропустил простой способ ожидания на другом (системном) процессе от пользовательского процесса?
Ваш процесс 32 бит и обслуживание 64 бит? IIRC есть некоторые ограничения в том, что 32-битный процесс может запросить около 64-битный процесс. –
@SriramSakthivel оба скомпилированы с целевым набором в «Любой» –
Какая строка выдает «Win32Exception». Это 'GetProcessById' или' WaitForExit'? –