2017-01-14 56 views
1

私は以下のコードを使用して現在のマシン上で実行中のプロセスのリストを取得しようとしています:.NET Process.GetProcesses() "アクセスが拒否されました。"

using System; 
using System.Data; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Security.Principal; 
using System.Security.Permissions; 
using System.ComponentModel; 

namespace Xynfo.Classes 
{ 
    class Processes 
    { 
     //Gets list of processes running on local machine 
     public static Process[] ProcessList = Process.GetProcesses(Environment.MachineName); 

     //Creates the data table that will hold the process data 
     public static DataTable ProcessTable = new DataTable(); 


     public DataTable GetProcessesInfo() 
     { 

      //Create DataTable Columns 

      ProcessTable.Columns.Add("Name", typeof(string)); 
      ProcessTable.Columns.Add("Start Time", typeof(DateTime)); 
      ProcessTable.Columns.Add("CPU %", typeof(TimeSpan)); 
      ProcessTable.Columns.Add("Threads", typeof(string)); 
      ProcessTable.Columns.Add("Session ID", typeof(int)); 
      ProcessTable.Columns.Add("Unique ID", typeof(int)); 
      ProcessTable.Columns.Add("RAM", typeof(float)); 
      ProcessTable.Columns.Add("Machine", typeof(string)); 
      ProcessTable.Columns.Add("Priority", typeof(int)); 




      foreach (Process Process in ProcessList) 
      { 
       string pName = Process.ProcessName; 
       DateTime pStartTime = Process.StartTime; 
       TimeSpan pProcTime = Process.TotalProcessorTime; 
       string pThreads = Process.Threads.ToString(); 
       int pSessionId = Process.SessionId; 
       int pId = Process.Id; 
       long pRam = Process.VirtualMemorySize64; 
       string pMachineName = Process.MachineName; 
       int pPriority = Process.BasePriority; 



       ProcessTable.Rows.Add(Process.ProcessName 
            ,Process.StartTime 
            ,Process.TotalProcessorTime 
            ,Process.Threads 
            ,Process.SessionId 
            ,Process.Id 
            ,Process.VirtualMemorySize64 
            ,Process.MachineName 
            ,Process.BasePriority); 
      } 

      return ProcessTable; 

     } 
    } 
} 

私は以下のエラーが取得しています:

System.ComponentModel.Win32Exception {"Access is denied."} 

enter image description here

を私は必要ですかコード内の特権のいくつかの種類ですか?もしそうなら、どうすればいいのですか?

+3

Right click exe->Run as Administrator)特権であなたのアプリケーションを実行しようとすることができます。 –

+0

スタックトレースを含めると、失敗した行が表示されますが、@ ZoranHorvatは正しいと思います。 – Michael

+0

Windowsでは、プロセスから照会できるデータに制限があります。例外を適切に処理し、エンドユーザーに許可されていないものを表示する必要があります。 –

答えて

1

どのプロセスであるか把握してください。たぶんそれはあなたが必要としないシステムプロセスです。もちろんあなたの必要性にもよります。あなたはまた、私の知る限りではないとしても、管理者権限が十分であるいくつかのシステムプロセスのために、同じことをやって覚えているよう

foreach (Process Process in ProcessList) 
{ 
    try 
    { 
     string pName = Process.ProcessName; 
     DateTime pStartTime = Process.StartTime; 
     TimeSpan pProcTime = Process.TotalProcessorTime; 
     string pThreads = Process.Threads.ToString(); 
     int pSessionId = Process.SessionId; 
     int pId = Process.Id; 
     long pRam = Process.VirtualMemorySize64; 
     string pMachineName = Process.MachineName; 
     int pPriority = Process.BasePriority; 



     ProcessTable.Rows.Add(Process.ProcessName 
          ,Process.StartTime 
          ,Process.TotalProcessorTime 
          ,Process.Threads 
          ,Process.SessionId 
          ,Process.Id 
          ,Process.VirtualMemorySize64 
          ,Process.MachineName 
          ,Process.BasePriority); 
    } 
    catch(Win32Exception e) 
    { 
     logger.LogWarning($"Error reading process {process.ProcessName}", e.Message); 
    } 
} 
関連する問題