.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."}
Нужны ли какие-то повышенные привилегии в коде? Если да, то как мне это сделать?
1 ответ
Попробуйте выяснить, какой это процесс. Может быть, это системный процесс, который вам не нужен. Зависит от вашей потребности, конечно. Вы также можете попробовать запустить приложение с повышенными привилегиями (Right click exe->Run as Administrator
)
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);
}
}