未能获得所有进程..win32异常,如何解决?

时间:2012-02-28 00:01:01

标签: c# process permissions client-server admin

我正在创建一个任务管理器应用程序(服务器 - 客户端)..所以我从服务器获取处理器列表作为字符串。我的问题是60-65%的处理器计数无法进入服务器端,就像在任务管理器快照中看到的那样..请注意,服务器应用程序已调试为管理员
服务器代码:

public void GetProcessors()
    {
        int i =0,j = 0;
        string answer = "";
        foreach (Process p in Process.GetProcesses())
        {
            try
            {
                answer += p.MainModule.ModuleName
                + "|" + p.Id.ToString()
                + "|" + string.Format("{0:N0} K", p.WorkingSet64 / 1024)
                + "|" + p.MainModule.FileVersionInfo.FileDescription;
                i++;
                answer += "?";
            }
            catch 
            {
                j++;
            }
        }
        answer = answer.Remove(answer.Length - 1, 1);
        send(string.Format("get<{0}<{1}<{2}", answer, i, j));
    }

客户方: 这称为任务管理器类

中的getProcessors方法
switch(command[1])
                    {
                        case "get":
                            Console.WriteLine(command[2]);
                            if (InvokeRequired)
                            {
                                Action a = () => taskManager1.GetProcessors(command[2], command[3], command[4]);
                                Invoke(a);
                            }
                            break;
                        default:
                        break;
                    }

(客户端)TASK MANAGER CLASS:

public void GetProcessors(string cmd,string success,string fail)
    {
        string[] Processors = cmd.Split('?');
        foreach (string process in Processors)
        {
            string[] info = process.Split('|');
            if (info.Length < 4)
            {
                MessageBox.Show(info.Length.ToString());
                continue;
            }
            ListViewItem item = new ListViewItem(info[0]);
            item.SubItems.Add(info[1]);
            item.SubItems.Add(info[2]);
            item.SubItems.Add(info[3]);
            listView1.Items.Add(item);
        }
        labelProcess.Text = string.Format("Processors: {0}", success);
        failedLabel.Text = string.Format("Failed: {0}", fail);
    }

enter image description here

我得到了那些例外 85 FAILS:83是{“32位进程无法访问64位进程的模块。”} 另外两个失败:{“无法枚举过程模块。”}

在我编辑代码并尝试在不使用Process.MainModule的情况下运行它之后,它给了我:
过程:147 ..失败:0 ..那么为什么我无法访问process.MainModule?

我该如何解决?

2 个答案:

答案 0 :(得分:1)

第一个错误是不言自明的。您需要使用Windows的64位API,因此您需要构建一个64位版本的工具。

第二个错误非常神秘。一些谷歌搜索出现了«你将无法访问某些进程(在SYSTEM凭据下运行的进程)或内置“系统”进程的MainModule属性。»这是一个预期的错误。

答案 1 :(得分:0)

在我将我的应用程序调试器更改为x64后,它可以工作..但我认为现在我必须制作32位和64位的两份副本... enter image description here