Есть ли способ обнаружить, если / когда процесс запускает другой процесс в C # .Net 2.0? - PullRequest
4 голосов
/ 04 декабря 2009

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

например, я запускаю программу в процессе. этот исполняемый файл выполняет некоторое исправление файла, а затем запускает основную программу - отдельный exe - и затем завершает работу. это приводит к тому, что Process.HasExited возвращает значение true, что приводит к преждевременному срабатыванию моего триггера. что меня действительно волнует, так это когда основная программа завершается, в данном случае это программа, с которой начался первоначальный процесс, но я не могу найти способ сделать это программно.

Ответы [ 3 ]

5 голосов
/ 05 декабря 2009

хорошо, я понял это. прямого доступа к информации о родительском процессе с помощью класса Process в .Net 2.0 нет, но с помощью класса System.Diagnostics.PerformanceCounter вы можете получить доступ к идентификатору родительского процесса из имени счетчика «Создание идентификатора процесса» , Чтобы решить мою проблему, я сделал что-то похожее на:

...
/// check to see if the monitored application (started in myProcess) is still running
public bool isRunning()
{
    bool running = !this.myProcess.HasExited;
    if(!running){
        foreach (Process p in Process.GetProcesses())
        {
            PerformanceCounter pc = new PerformanceCounter("Process", "Creating Process Id", p.ProcessName);
            if (this.myProcess.Id == (int)pc.RawValue)
            {
                running = true;
            }
        }
    }
    return running;
}
...

В этом примере я исключил обработку ошибок, и как более продвинутое решение вы могли отслеживать дерево порожденных процессов, поддерживая список всех идентификаторов процессов ветвления, в этом примере отслеживается только один прямой дочерний процесс.

1 голос
/ 20 декабря 2009

Я думаю, это не очень просто, но выполнимо.

В этом случае я бы выбрал вместо этого WMI. Вы первый старт Перечислите существующие процессы [эфирный путь, WMI или Net Process] и запомните их, вы увидите. Затем вы запускаете два запроса событий WMI, один с помощью Win32_ProcessStartTrace и еще один для запроса Win32_ProcessStopTrace [см. WMI SDK]. Оба возвращают экземпляр Win32_Process , который всегда содержит «ParentProcessID». Если это один из них, вы спасли раньше, у вас есть порожденный процесс. «Win32_Process» также содержит метод "Убить"; без понятия, что вы, наконец, хотите сделать; -)

Надеюсь, это поможет. Не стесняйтесь спрашивать более подробную информацию.

ш - mabra

1 голос
/ 04 декабря 2009

Если эти другие процессы являются проприетарными / не находятся под вашим контролем, я действительно не понимаю, как вы можете контролировать их, проверять, не порождают ли они новые процессы, тем более, если вы хотите проверить, порождают ли порожденные процессы процессы внуков и. .. (ты знаешь, куда я иду).

Во всяком случае, это мое мнение, это может быть выполнимо, я просто не думаю, что это может быть достигнуто с помощью только .NET / C #.

Надеюсь, кто-то еще сможет предложить реальное решение.

...