C# Win32异常:";“访问被拒绝”;尝试通过Process.getProcesss()执行LINQ查询时

C# Win32异常:";“访问被拒绝”;尝试通过Process.getProcesss()执行LINQ查询时,c#,linq,process,C#,Linq,Process,我试图执行下面的代码以按优先级对正在运行的进程进行分组,在linq查询的GROUPBY子句中出现Win32异常(“访问被拒绝”)。我在VS2010中以管理员权限运行了这段代码 var processesList=Process.getprocesss(); var processQuerySet=来自ProcessList中的进程 按进程对进程进行分组。PriorityClass分为priorityGroup 选择优先级组; foreach(processQuerySet中的var优先级) {

我试图执行下面的代码以按优先级对正在运行的进程进行分组,在linq查询的GROUPBY子句中出现Win32异常(“访问被拒绝”)。我在VS2010中以管理员权限运行了这段代码

var processesList=Process.getprocesss();
var processQuerySet=来自ProcessList中的进程
按进程对进程进行分组。PriorityClass分为priorityGroup
选择优先级组;
foreach(processQuerySet中的var优先级)
{
Console.WriteLine(priority.Key.ToString());
foreach(优先级为var流程)
{
Console.WriteLine(“\t{0}{1}”,process.ProcessName,process.WorkingSet64);
}
}

您无法访问所有进程的PriorityClass。我会写

ProcessPriorityClass GetPriority(Process p)
{
    try{
        return p.PriorityClass;
    }catch{
        return (ProcessPriorityClass)0;
    }
}
并称之为

group process by GetPriority(process) into priorityGroup

您不能访问所有进程的PriorityClass。我会写

ProcessPriorityClass GetPriority(Process p)
{
    try{
        return p.PriorityClass;
    }catch{
        return (ProcessPriorityClass)0;
    }
}
并称之为

group process by GetPriority(process) into priorityGroup

有些进程会抛出异常,如“System”和“Idle”,这是一种安全设计,其他时间是在运行32位进程并尝试访问64位进程时,因此为了避免这些异常,我们将筛选出有异常的异常,1种可能的方式如下:

Dictionary<string, List<Process>> procs = new Dictionary<string, List<Process>>()
{
    {"With Exception",new List<Process>()},
    {"Without Exception",new List<Process>()}
};

foreach (var proc in Process.GetProcesses())
{
    Exception ex = null;
    try
    {
        //based on your example,many other properties will also throw
        ProcessPriorityClass temp = proc.PriorityClass;
    }
    catch (Exception e)
    {
         ex = e;
    }
    finally
    {
         if (ex == null)
             procs["Without Exception"].Add(proc);
         else
             procs["With Exception"].Add(proc);
    }
}

var processQuerySet = from process in procs["Without Exception"]
                      group process by process.PriorityClass into priorityGroup
                      select priorityGroup;

foreach (var priority in processQuerySet)
{
     Console.WriteLine(priority.Key.ToString());
     foreach (var process in priority)
     {
         Console.WriteLine("\t{0}   {1}", process.ProcessName, process.WorkingSet64);
     }
}
Dictionary procs=newdictionary()
{
{“有例外”,新列表()},
{“毫无例外”,新列表()}
};
foreach(var proc in Process.getprocesss())
{
异常ex=null;
尝试
{
//根据您的示例,许多其他属性也将抛出
ProcessPriorityClass温度=proc.PriorityClass;
}
捕获(例外e)
{
ex=e;
}
最后
{
如果(ex==null)
程序[“无例外”]。添加(程序);
其他的
程序[“有例外”]。添加(程序);
}
}
var processQuerySet=来自进程中的进程[“无异常”]
按进程对进程进行分组。PriorityClass分为priorityGroup
选择优先级组;
foreach(processQuerySet中的var优先级)
{
Console.WriteLine(priority.Key.ToString());
foreach(优先级为var流程)
{
Console.WriteLine(“\t{0}{1}”,process.ProcessName,process.WorkingSet64);
}
}

我把事情说得很清楚,所以你知道发生了什么。

有些进程会抛出异常,比如“系统”和“空闲”,这是一种安全设计,其他时候是当你运行32位进程并试图访问64位时,为了避免这些异常,我们将过滤掉那些有异常的,1种可能的方式如下:

Dictionary<string, List<Process>> procs = new Dictionary<string, List<Process>>()
{
    {"With Exception",new List<Process>()},
    {"Without Exception",new List<Process>()}
};

foreach (var proc in Process.GetProcesses())
{
    Exception ex = null;
    try
    {
        //based on your example,many other properties will also throw
        ProcessPriorityClass temp = proc.PriorityClass;
    }
    catch (Exception e)
    {
         ex = e;
    }
    finally
    {
         if (ex == null)
             procs["Without Exception"].Add(proc);
         else
             procs["With Exception"].Add(proc);
    }
}

var processQuerySet = from process in procs["Without Exception"]
                      group process by process.PriorityClass into priorityGroup
                      select priorityGroup;

foreach (var priority in processQuerySet)
{
     Console.WriteLine(priority.Key.ToString());
     foreach (var process in priority)
     {
         Console.WriteLine("\t{0}   {1}", process.ProcessName, process.WorkingSet64);
     }
}
Dictionary procs=newdictionary()
{
{“有例外”,新列表()},
{“毫无例外”,新列表()}
};
foreach(var proc in Process.getprocesss())
{
异常ex=null;
尝试
{
//根据您的示例,许多其他属性也将抛出
ProcessPriorityClass温度=proc.PriorityClass;
}
捕获(例外e)
{
ex=e;
}
最后
{
如果(ex==null)
程序[“无例外”]。添加(程序);
其他的
程序[“有例外”]。添加(程序);
}
}
var processQuerySet=来自进程中的进程[“无异常”]
按进程对进程进行分组。PriorityClass分为priorityGroup
选择优先级组;
foreach(processQuerySet中的var优先级)
{
Console.WriteLine(priority.Key.ToString());
foreach(优先级为var流程)
{
Console.WriteLine(“\t{0}{1}”,process.ProcessName,process.WorkingSet64);
}
}

我把事情说得很清楚,这样你就知道发生了什么。

一般来说,你需要管理权限来获取其他用户拥有的进程的信息。但是,即使以管理员身份运行,也不允许您访问所有进程的属性。请参阅“一般情况”,您需要管理权限才能获取有关其他用户拥有的进程的信息。但是,即使以管理员身份运行,也不允许您访问所有进程的属性。看见