网上常见的都试过了不好用,比如:
首先在添加引用中选中System.Management
 
using System.Management;
using System.Management.Instrumentation;private void GetInfo() 
   { 
    string cpuInfo = "";//cpu序列号 
    ManagementClass cimobject = new ManagementClass("Win32_Processor"); 
    ManagementObjectCollection moc = cimobject.GetInstances(); 
    foreach(ManagementObject mo in moc) 
    { 
     cpuInfo = mo.Properties["ProcessorId"].Value.ToString(); 
     Response.Write ("cpu序列号:"+cpuInfo.ToString ()); 
    }     //获取硬盘ID 
    String HDid; 
    ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive"); 
    ManagementObjectCollection moc1 = cimobject1.GetInstances(); 
    foreach(ManagementObject mo in moc1) 
    { 
     HDid = (string)mo.Properties["Model"].Value; 
     Response.Write ("硬盘序列号:"+HDid.ToString ()); 
    } 
    //获取网卡硬件地址     
    
    ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
    ManagementObjectCollection moc2 = mc.GetInstances(); 
    foreach(ManagementObject mo in moc2) 
    { 
     if((bool)mo["IPEnabled"] == true) 
      Response.Write("MAC address\t{0}"+mo["MacAddress"].ToString()); 
     mo.Dispose(); 
    } 
   }     public static float GetCPUPersent()
    {
        float cpuload = 0;
        const string categoryname = "processor";
        const string countername = "% processor time";
        const string instancename = "_total";
        PerformanceCounter pc = new PerformanceCounter(categoryname, countername, instancename);
        int i = 10;
        while (i > 0)
        {
            Thread.Sleep(1000); // wait for 1 second
            cpuload = pc.NextValue();
            if (cpuload > 0)
            {
                break;
            }
            i--;
        }
        return cpuload;
    }    public static void GetDiskSpace(string path, out long DiskAll, out long DiskActive)
    {
        DiskAll = 0;
        DiskActive = 0;
        long a, b, c;
        int aaa = GetDiskFreeSpaceEx(path, out a, out b, out c);
        DiskAll = (long)(b / 1024 / 1024);
        DiskActive = (long)(a / 1024 / 1024);
    }    public static void GetMemoryInfo(out uint MemoryAll, out uint MemoryUsed)
    {
        MemoryAll = 0;
        MemoryUsed = 0;
        MEMORY_INFO MemInfo = new MEMORY_INFO();
        GlobalMemoryStatus(ref  MemInfo);
        MemoryAll = MemInfo.dwTotalPhys / 1024 / 1024;
        MemoryUsed = (MemInfo.dwTotalPhys - MemInfo.dwAvailPhys) / 1024 / 1024;
    }       [DllImport("kernel32")]
    public static extern void GlobalMemoryStatus(ref  MEMORY_INFO meminfo);    //定义内存的信息结构 
    [StructLayout(LayoutKind.Sequential)]
    public struct MEMORY_INFO
    {
        public uint dwLength;
        public uint dwMemoryLoad;
        public uint dwTotalPhys;
        public uint dwAvailPhys;
        public uint dwTotalPageFile;
        public uint dwAvailPageFile;
        public uint dwTotalVirtual;
        public uint dwAvailVirtual;
    }    [DllImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceExA")]
    public static extern int GetDiskFreeSpaceEx(string lpRootPathName, out long lpFreeBytesAvailable, out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes);很多算法,不是不通用(有的取不到数据),就是不唯一(多次运行会变)
求一个好用的算法,谢谢!

解决方案 »

  1.   


            public static String GetMainBoardInfo()
            {
                try
                {
                    using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard"))
                    {
                        StringBuilder sb = new StringBuilder();
                        ManagementObjectCollection moc = searcher.Get();
                        foreach (ManagementObject mo in moc)
                        {
                            sb.Append(mo["Manufacturer"]).Append(";").Append(mo["Product"]).Append(";").Append(mo["SerialNumber"]);                    }
                        return sb.ToString();
                    };
                }
                catch (Exception ex)
                {
                    return "Hewlett-Packard;0A54h;CNG7200QDG";
                }
            }我们一直用
      

  2.   

    下载 chrome源码好象第一行就是的。而且挺好用的。C++ 嵌入汇编 获取CPU信息  2010-07-20 15:03:54|  分类: C++ & C |字号 订阅
    #include "windows.h" 
    #include "iostream"
    #include "string"using namespace std;//用来存储信息
    DWORD deax;
    DWORD debx;
    DWORD decx;
    DWORD dedx;void ExeCPUID(DWORD veax)//初始化CPU
    {
    __asm
    {
       mov eax,veax
        cpuid
        mov deax,eax
        mov debx,ebx
        mov decx,ecx
        mov dedx,edx
    }
    }long GetCPUFreq()//获取CPU频率,单位: MHZ
    {
    int start1,start2;
    _asm rdtsc
       _asm mov start1,eax
       Sleep(50);
    _asm rdtsc
       _asm mov start2,eax
       return (start2-start1)/50000;
    }string GetManID()//获取制造商信息
    {
    char ID[25];//存储制造商信息
    memset(ID,0,sizeof(ID));//先清空数组 ID
    ExeCPUID(0);//初始化
    memcpy(ID+0,&debx,4);//制造商信息前四个字符复制到数组
    memcpy(ID+4,&dedx,4);//中间四个
    memcpy(ID+8,&decx,4);//最后四个
    //如果返回 char * ,会出现乱码;故返回 string 值
    return string(ID);
    }string GetCPUType()
    {
    const DWORD id = 0x80000002; //从0x80000002开始,到0x80000004结束
    char CPUType[49];//用来存储CPU型号信息
    memset(CPUType,0,sizeof(CPUType));//初始化数组for(DWORD t = 0 ; t < 3 ; t++ )
    {
       ExeCPUID(id+t);
       //每次循环结束,保存信息到数组
       memcpy(CPUType+16*t+ 0,&deax,4);
       memcpy(CPUType+16*t+ 4,&debx,4);
       memcpy(CPUType+16*t+ 8,&decx,4);
       memcpy(CPUType+16*t+12,&dedx,4);
    }return string(CPUType);
    }void main() 

    cout<<"本机CPU信息如下:"<<endl;
    cout<<"CPU 主 频: "<<GetCPUFreq()<<" MHZ"<<endl;
    cout<<"CPU 制造商: "<<GetManID()<<endl;
    cout<<"CPU 型 号: "<<GetCPUType()<<endl;
    cin.get();}c#调用汇编代码的例子网上有。
      

  3.   


    我也用过,稍有不同:        public String GetBaseBoard()
            {
                try
                {
                    List<string> list = new List<string>();
                    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard");
                    String ret = null;
                    foreach (ManagementObject mo in searcher.Get())
                    {
                        ret = mo["SerialNumber"].ToString().Trim();
                        if (!string.IsNullOrEmpty(ret))
                            list.Add(ret);
                    }
                    if (list.Count > 0)
                    {
                        list.Sort();
                        return list[0];
                    }
                }
                catch
                {
                }            return string.Empty;
            }好像跟你的没太大区别呀,你确定你的算出来时唯一并且不变的吗?
      

  4.   


    核心还是SerialNumber字段,有人说重装系统后SerialNumber会变,我也没重装系统测试过。
      

  5.   

    我用过System.Management重装系统之后确实会变
      

  6.   

    Guid生成之后传回服务器保存,
    再对比验证
      

  7.   

    其实 可以用的啊 只不过有些返回不到的 你就catch 一个固定的就好了
      

  8.   


    我发的那个代码是用汇编写的。
    你也可以把他编译个标准的dll。用LoadLibrary加载。
    那是直接取cpu的ID不可能改的。
    至于wmi的方式。我机子上的这个服务从来都关闭的。
      

  9.   

    劳烦给个cpu序列号的获取函数
      

  10.   

    我只想告诉你,除了Intel Pentium III,没有CPU有基于硬件的唯一序列号。而且Pentium III的序列号也是可以关闭的。