2014-09-25 4 views
0

Мне интересно, возможно ли получить связанный идентификатор процесса из процесса werfault в C#. Я не хочу отключать службу werfault, а только получить связанный (замороженный) идентификатор процесса. Я написал этот код:Как получить замороженный идентификатор процесса из процесса werfault

Process[] processes = Process.GetProcesses(); 
foreach (Process p in processes) 
{ 
    if (p.ProcessName.ToLower().Contains("werfault")) 
    { 
     //getting related process id? 
    } 
} 

Например: werfault service сообщает, что «programX перестала работать». Я использую приведенный выше код, чтобы найти процесс werfault, а затем убейте его и извлеките pid programX (который я не могу сделать прямо сейчас).

Я нашел частичный ответ здесь: How to launch crashing (rarely) application in subprocess, но это работает для python.

Можно ли это получить? Нужны ли мне внешние библиотеки?

ответ

0
Process[] psWerFaultReporter = Process.GetProcessesByName("WerFault"); 
    int werfaultProcessId = -1; 
    if (psWerFaultReporter.Length > 0) 
    { 
     werfaultProcessId = psWerFaultReporter[0].Id; 
    } 
0
Process[] processes = Process.GetProcesses(); 
    foreach (Process p in processes) 
    { 
     if (p.ProcessName.ToLower().Contains("werfault")) 
     { 
      // Get the CommandLine string from the werfault.exe 
      string startupParam = GetCommandLine(p); 

      // Get the ProcessID of the frozen Process. 
      // Sure you can optimize this part, but it works in this case :) 
      int pID = int.Parse(startupParam.Split(new string[] { "-p" }, StringSplitOptions.None). 
         Last().Split(new string[] { "-s" }, StringSplitOptions.None).First().Trim()); 

      // Get the frozen Process. 
      Process frozenProcess = Process.GetProcessById(pID); 
     } 
    } 

    /// <summary> 
    /// Returns the CommandLine from a Process. 
    /// </summary> 
    /// <param name="process"></param> 
    /// <returns></returns> 
    private static string GetCommandLine(Process pProcess) 
    { 
     // Create a new CommandLine with the FileName of the given Process. 
     var commandLine = new StringBuilder(pProcess.MainModule.FileName); 
     commandLine.Append(" "); 

     // Now we need to query the CommandLine of the process with ManagementObjectSearcher. 
     using (var searcher = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + pProcess.Id)) 
     { 
      // Append the arguments to the CommandLine. 
      foreach (var @object in searcher.Get()) 
      { 
       commandLine.Append(@object["CommandLine"]); 
       commandLine.Append(" "); 
      } 
     } 

     // Return the CommandLine. 
     return commandLine.ToString(); 
    } 
+2

Пожалуйста, объясните свой ответ – Mazz

+0

Всякий раз, когда процесс вызывает исключение, окна начинает werfault.exe, который находится под «C:. \ Windows \ System 32 \ WerFault.exe Windows, автоматически переходит ИДП от замороженного или разбитого приложения к этому WerFault.exe, которое можно получить с помощью функции GetCommandLine. Поэтому, если вы хотите получить замороженное приложение, связанное с процессом WerFault, вам сначала нужно получить CommandLine, который имеет был передан этому WerFault.exe. Эта команда содержит идентификатор процесса замороженного/аварийного процесса. – Emphosix

+0

Командная строка выглядит примерно так: «C: \\ Windows \\ SysWOW64 \\ WerFault.exe -u -p 5012 -s 68 " Таким образом, в этом случае 5012 будет идентификатором процесса замороженного процесса. С помощью этого идентификатора вы можете просто выполнить поиск этого конкретного процесса с помощью функции Process.GetProcessByID – Emphosix

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