2017-05-21 133 views
1

我想檢索與特定名稱模式匹配的所有正在運行的進程的信息。我通過使用我在網上找到的以下代碼來做到這一點,顯然它應該可以幫助解決Windows Vista及更高版本上的一些特權問題。可悲的是,這並不適合我。我以管理員身份執行以下代碼。僅僅運行一次就可以正常運行正在運行的進程

Natives.OpenProcess工作正常,在第一次被調用,但沒有對每次調用後,通過返回IntPtr.Zero和GetLastWin32Error()返回「拒絕訪問」。

public static string GetExecutablePathAboveVista(int ProcessId) 
    { 
     var buffer = new StringBuilder(1024); 
     IntPtr hprocess = Natives.OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION, false, ProcessId); 

     if (hprocess != IntPtr.Zero) 
     { 
      try 
      { 
       int size = buffer.Capacity; 
       if (Natives.QueryFullProcessImageName(hprocess, 0, buffer, out size)) 
       { 
        return buffer.ToString(); 
       } 
      } 
      finally 
      { 
       Natives.CloseHandle(hprocess); 
      } 
     } 
     throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

回答

0

OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, ..)給你ERROR_ACCESS_DENIED當且僅當你沒有SE_DEBUG_PRIVILEGE啓用。因此只能有2種情況:或者在第一次調用GetExecutablePathAboveVista之前,您已在線程(如果有令牌)或進程令牌中啓用SE_DEBUG_PRIVILEGE。並且在第二次/下一次調用您直接或間接調用所有間接禁用此特權或使用另一個令牌模擬線程。或者說你可能會說混淆進程 - 第一次打開一個進程(id),第二次嘗試打開另一個進程(id) - 不清楚你的代碼。

我以管理員身份執行以下代碼。

這還不夠。這意味着只有在你的進程中令牌存在SE_DEBUG_PRIVILEGE。 (與默認窗口設置,但是這可以改變),但你需要這個特權將啓用令牌,不只是存在。

匹配某個名字模式

,如果你只需要處理沒有完整路徑 - 你已經擁有了它,當你列舉所有正在運行的進程。

也存在無證SystemProcessIdInformation信息類ZwQuerySystemInformation函數 - 有了它,你可以得到過程的完整路徑,而不打開它,有任何特權。

+0

我不知道我完全理解了你的整個評論,但我想我明白了。它仍然沒有解釋爲什麼第一個電話工作,只有第二個電話失敗。如果我第一次擁有這個特權,我應該第二次擁有它,因爲我沒有改變線程或任何想象。 – a20eac1d

+0

@ a20eac1d - 你們兩個都試着打開相同的進程ID嗎? *最好使用'ZwQuerySystemInformation(SystemProcessIdInformation,..)'獲取可執行文件的完整路徑。如果您不想使用未公開的API - 您必須在調用'GetExecutablePathAboveVista'前**在您的令牌中啓用** SE_DEBUG_PRIVILEGE。可能是第一次和第二次調用之間的某些代碼在您的令牌中禁用此特權。 – RbMm