2014-09-23 105 views
1

我正在使用System.Diagnostics.Process.GetProcessByName()來訪問作爲Windows服務運行的wcf服務主機。Process.MainModule訪問被拒絕

該進程託管多個服務,我試圖訪問其中一個服務的WorkingSet64。當我調用System.Diagnostics.Process.GetProcessByName()時,返回4個進程提供的名稱,當我通過這些進程循環訪問Process.MainModule.Filename時,出現「訪問被拒絕」錯誤。

當我在我的開發機器上運行代碼時,它似乎返回我期望的信息(ACL已關閉),當我在服務器上運行代碼時(ACL已打開),該進程作爲系統進程運行訪問被拒絕異常被拋出。

我已經在幾個地方看到過這個問題,但大多數答案都建議只用try catch跳過不可訪問的項目,這不是我想要的,我需要檢查無法訪問的項目。下面

代碼演示了一個例子:

class Program 
{ 
    static void Main(string[] args) 
    { 

     Process[] service; 
     service = Process.GetProcesses(); 

     Console.WriteLine(service.Count()); 

     foreach (var s in service) 
     { 
      Console.WriteLine(s.ProcessName); 

      try 
      { 
       Console.WriteLine(s.WorkingSet64); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("ERROR---" + ex.Message); 
      } 

      Console.WriteLine("-------------------"); 
     } 

     Console.ReadLine(); 

    } 
} 

感謝

+0

你,只要你迭代GetProcesses在和自己的失敗保證()。你必須有選擇性地避免那些你永遠無法訪問的東西。使用WCF的重點是永遠不必這樣做。 – 2014-09-23 16:38:14

+0

我不確定爲什麼這會被標記爲關閉,很明顯是什麼被問到,它不是'廣泛'。用戶希望獲取當前正在運行的所有進程,但服務權限不夠高,並且他獲取了拒絕訪問。如果沒有爲服務創建特定的管理員用戶下我唐諾運行你將如何解決這個... – Phill 2014-09-23 16:45:29

+1

的*僅*的方式來解決這個問題是用管理員權限運行服務。這是訪問控制的關鍵...... – 2014-09-23 16:50:03

回答

0

我很欣賞的訪問控制的地步,我只是想知道如果任何人對如何更好地實現任何智能建議,這讓我可以訪問我需要的信息。

最終我實現了一個內部的Windows服務,我可以用我想要訪問的服務過程信息的名,訣竅是這個內部服務與同一接入我們的其他內部流程運行。

當我打電話給內部服務時,訪問任何其他Windows服務的進程信息都沒有問題。