none
请教WMI获得CUP信息的一个问题:使用 Win32_Processor 无效 RRS feed

  • 问题

  • 大家好,小弟近来需要做一个程序,获得CUP的相关信息,参考了网上的相关代码(使用WMI写的),代码如下:

        public static String[] GetCPUSerialNumbers()
        {
          var list = new List<String>();
          StringBuilder all = new StringBuilder(String.Empty);
          ManagementClass mc = new ManagementClass("Win32_Processor");
          ManagementObjectCollection moc = mc.GetInstances();
          foreach (ManagementObject mo in moc)
          {
            var id = mo["ProcessorId"].ToString();
            list.Add(id);
            all.Append(id);
          }
          mc.Dispose();
          moc.Dispose();
          list.Add(all.ToString());
          //Debug.Print("CUPID=" + cpuSerialNumber);
          return list.ToArray();
        }
    


    本代码出现了一个十分奇怪的问题,就是在某些计算机上运行不成功。产生错误,其实我知道,这些代码其实就是调用了WMI类,我用VBScript写了一个,结果当然也是不成功的。代码如下:

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" _
      & strComputer & "\root\cimv2")
    Set colSettings = objWMIService.ExecQuery _
      ("Select * from Win32_Processor")
    
    For Each objComputer in colSettings 
    	Wscript.Echo vbClrf
      Wscript.Echo "Processor Name: " & objComputer.Name
      Wscript.Echo "Processor: " & _
        objComputer.ProcessorId 
    Next
    


    这里,ProcessorId  返回的是一个空白字符串。

    但是我在网上找了一个程序,是可以成功获得的,该程序可以输出像以下的结果(四核CPU):


    默认样式
    CPU的个数:4
    单机CPU:10524832641928396809395049983
    第 0 个 CPU的序列号:10524832641928396809395049983
    第 1 个 CPU的序列号:1052483170414088396809395049983
    第 2 个 CPU的序列号:1052483338186248396809395049983
    第 3 个 CPU的序列号:1052483505958408396809395049983

    分隔符样式
    CPU的个数:4
    单机CPU:00100F43-00040800-00802009-178BFBFF
    第 0 个 CPU的序列号:00100F43-00040800-00802009-178BFBFF
    第 1 个 CPU的序列号:00100F43-01040800-00802009-178BFBFF
    第 2 个 CPU的序列号:00100F43-02040800-00802009-178BFBFF
    第 3 个 CPU的序列号:00100F43-03040800-00802009-178BFBFF

    我现在的问题是,在C#中,怎样实现像以上的功能呢?

    多谢!

     


    陈景标
    2011年7月20日 10:47

答案

  • dear

    参考以下片段

     

        public string GetCPUUsage()
        {
          //CPU数和使用率
          ManagementObjectSearcher search = new ManagementObjectSearcher("Select LoadPercentage from Win32_Processor");
          int i = 0;
          double total = 0.0;
          string strMsg = string.Empty;
          foreach (ManagementObject info in search.Get())
          {
            i = i + 1;
            total += Convert.ToDouble(info["LoadPercentage"].ToString());
            strMsg += string.Format("CPU ({0}):占用率:{1}", i, info["LoadPercentage"].ToString());
          }
          strMsg += string.Format("<br/>所有CPU的占用率为:{0}", total / i);
          return strMsg;
    
        }


     


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年7月20日 12:42

全部回复

  • dear

    参考以下片段

     

        public string GetCPUUsage()
        {
          //CPU数和使用率
          ManagementObjectSearcher search = new ManagementObjectSearcher("Select LoadPercentage from Win32_Processor");
          int i = 0;
          double total = 0.0;
          string strMsg = string.Empty;
          foreach (ManagementObject info in search.Get())
          {
            i = i + 1;
            total += Convert.ToDouble(info["LoadPercentage"].ToString());
            strMsg += string.Format("CPU ({0}):占用率:{1}", i, info["LoadPercentage"].ToString());
          }
          strMsg += string.Format("<br/>所有CPU的占用率为:{0}", total / i);
          return strMsg;
    
        }


     


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年7月20日 12:42
  • 余小章MVP你好,你的代码在我的计算机上测试了一下,我的计算机是4核的,但这段代码出来的结果还是只循环一次,

    but any way ,thank you very much!

    另外,我昨晚也参考过以上网址:

    Win32_PerfRawData_PerfOS_Processor Class

    你看看有没有帮助较往年,多谢!

    另外,我的关键问题是如何获得四个CUP的 ID,即ProcessorId


    陈景标
    2011年7月21日 1:08