2017-09-14 31 views
-1

我創建了一個在計算機上記錄用戶活動歷史記錄的應用程序。目前,我需要找出文件路徑(例如с:\documents\FileName.docx),例如在Word中打開。我剛剛知道EXE文件的路徑。我有進程ID,但在ManagementObject我沒有找到任何有關可執行文件路徑的信息。我怎樣才能做到這一點?下面的方法我如何通過進程ID獲取.exe文件路徑。如何查找正在執行的Word或Excel文件的文件路徑(例如文件 - 微軟Word)。 С#

public static string GetMainModuleFilepath(int processId) 
     { 
      string wmiQueryString = "SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId; 
      using (var searcher = new ManagementObjectSearcher(wmiQueryString)) 
      { 
       using (var results = searcher.Get()) 
       { 
        ManagementObject mo = results.Cast<ManagementObject>().FirstOrDefault(); 
        return (string)mo?["ExecutablePath"]; 
       } 
      }    
     } 

回答

0

我已經嘗試了很多這些和下面是什麼樣的代碼爲我工作最好。

無論它是32位還是64位應用程序,這都應該可以工作。

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Management; 
using System.Text; 
using System.Threading.Tasks; 

namespace WmiTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int processID = 12624; // Change for the process you would like to use 
      Process process = Process.GetProcessById(processID); 
      string path = ProcessExecutablePath(process); 
     } 

     static private string ProcessExecutablePath(Process process) 
     { 
      try 
      { 
       return process.MainModule.FileName; 
      } 
      catch 
      { 
       string query = "SELECT ExecutablePath, ProcessID FROM Win32_Process"; 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 

       foreach (ManagementObject item in searcher.Get()) 
       { 
        object id = item["ProcessID"]; 
        object path = item["ExecutablePath"]; 

        if (path != null && id.ToString() == process.Id.ToString()) 
        { 
         return path.ToString(); 
        } 
       } 
      } 

      return ""; 
     } 
    } 
} 

請注意,你必須引用System.Management組裝和使用System.Management命名空間

原始來源: https://stackoverflow.com/a/14668097/3850405

相關問題