.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);
    }
}
Другие вопросы по тегам