请教获取cpu序列号的正解
我用ManagementClass获得的id是AFE9FBFF000006D8和我另外一台机器上的号码一样,郁闷!如果你的解答类似下面代码请不要回复,不胜感激!ManagementClass mc = new ManagementClass("Win32_Processor"); 
ManagementObjectCollection moc = mc.GetInstances(); 
foreach (ManagementObject mo in moc) 

cpuInfo = mo.Properties["ProcessorId"].Value.ToString(); 

解决方案 »

  1.   

    请教大虾是否能通过其它工具(c++、delphi)编写获得cpu序列号的dll,c#中再调用该dll来获得cpu序列号?
      

  2.   

    没出现你的现象.
    #region    取网卡CPU序列号返回数组
            /// <summary>
            /// 取网卡CPU序列号返回数组
            /// </summary>
            /// <returns>返回数组</returns>
            private static string[] GetCMID()
            {
                string[] textArray1 = new string[2];
                ManagementClass class1 = new ManagementClass("WIN32_Processor");
                ManagementObjectCollection collection1 = class1.GetInstances();
                using (ManagementObjectCollection.ManagementObjectEnumerator enumerator1 = collection1.GetEnumerator())
                {
                    while (enumerator1.MoveNext())
                    {
                        ManagementObject obj1 = (ManagementObject)enumerator1.Current;
                        textArray1[0] = obj1.Properties["ProcessorId"].Value.ToString();
                    }
                }
                ManagementClass class2 = new ManagementClass("WIN32_NetworkAdapterConfiguration");
                ManagementObjectCollection collection2 = class2.GetInstances();
                using (ManagementObjectCollection.ManagementObjectEnumerator enumerator1 = collection2.GetEnumerator())
                {
                    while (enumerator1.MoveNext())
                    {
                        ManagementObject obj2 = (ManagementObject)enumerator1.Current;
                        if ((bool)obj2["IPEnabled"])
                        {
                            textArray1[1] = obj2["MacAddress"].ToString().Replace(":", "").ToString();
                        }
                    }
                }
                return textArray1;
            }
            #endregion
      

  3.   

    我就是用那种方法获取的CPU序列号,没问题,俺的注册码就是通过CPU序列号做的
      

  4.   

    拜托不要帖与ManagementClass相关的代码了,网上到处都是!
    为什么我用ManagementClass在两台机器(cpu分别是mp740、mp730)上获得的cpu序列号都是AFE9FBFF000006D8呢?
      

  5.   

    我也发现这一现像,不过可能不能只通过CPU号,可以在加上其他的号.来做.
      

  6.   

    我用delphi做过获取cpuid的程序,嵌套的汇编代码
    生成的号码唯一
    为什么C#就不行了呢
      

  7.   

    在机房做了个测试,ManagementClass获得的cpuid、硬盘id完全一样
    leohuang(LEO)是怎么用的哦
      

  8.   

    C#嵌入汇编代码:public class CCpuInfo
    {
    private byte[] MachineCode;
    private int EAX;
    private static byte[] AssemblyValue; 
    private static int[] ValueTable = new int[ 256 ]; 
            
    private static string StringToRun = "This is a really fun example"; 
    private delegate void FUNCTIONDUMP();
    [DllImport("user32", EntryPoint="CallWindowProc")] 
    public static extern int CallWindowProcA([ MarshalAs( UnmanagedType.LPArray) ]byte[] lpPrevWndFunc,ref int hWnd, [ MarshalAs( UnmanagedType.LPArray ) ]byte[] Msg, [ MarshalAs( UnmanagedType.LPArray ) ]int[] wParam, int lParam);
    [DllImport("Kernel32.dll")]
    private static extern long CopyMemory(ref long lpvDest,long lpvSource, long cbCopy);
    [DllImport("user32", EntryPoint="CallWindowProc")] 
    public static extern int CallWindowProcB([ MarshalAs( UnmanagedType.LPArray) ]byte[] lpPrevWndFunc,int hWnd, [ MarshalAs( UnmanagedType.LPArray ) ]byte[] Msg, [ MarshalAs( UnmanagedType.LPArray ) ]byte[] wParam,[ MarshalAs( UnmanagedType.LPArray ) ]byte[] lParam); public CCpuInfo()
    {

    }
    public static int CalculateFromAssembly( byte[] ByteArray ) 

    int returnValue = 0; 
    int ByteSize = ByteArray.Length; 
    CallWindowProcA( AssemblyValue,ref returnValue, ByteArray, ValueTable,ByteSize  ); 
    return returnValue; 
    }  unsafe public string GetCpuName()
    {
    string name = "";
    byte[] CpuName1 = new byte[4];
    byte[] CpuName2 = new byte[4];
    byte[] CpuName3 = new byte[4];
    try
    {
    byte[] StringByte; 
    InitializeVals();
    System.Text.ASCIIEncoding UEnc = new System.Text.ASCIIEncoding(); 
    StringByte = UEnc.GetBytes( StringToRun );          
        InitFunc();
    CallWindowProcB(MachineCode,EAX,CpuName1,CpuName2,CpuName3);
    }
    catch(Exception ep)
    {
    MessageBox.Show(ep.Message+ep.StackTrace.ToString());
    }
    string name1 = "";
    string name2 = "";
    string name3 = "";
    for(int i =0;i < 4;i ++)
    {
    name1 += System.Convert.ToChar(CpuName1[i]);
    name2 += System.Convert.ToChar(CpuName3[i]);
    name3 += System.Convert.ToChar(CpuName2[i]);
    }
    return name = name1 + name2 + name3;
    }
    public static void funcDump()
    { int x;
    x =0;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    x =1;
    x =1;
    x = 4;
    }
    unsafe public int GetAddress(int Addr)
    {
    return (int)&Addr;
    }
    private void InitFunc()
    {
    EAX = 0;
    MachineCode = new byte[35];
    MachineCode[0] = 0X55;//    'push ebp
        
    MachineCode[1] = 0x8B;//    'move ebp,esp
    MachineCode[2] = 0xEC;
        
    MachineCode[3] = 0x57;//    'push edi
        
    MachineCode[4] = 0x52;//    'push edx
        
    MachineCode[5] = 0x51;//    'push ecx
        
    MachineCode[6] = 0x53;//    'push ebx
        
    MachineCode[7] = 0x8B;//    'move eax,dword ptr [ebp+8]
    MachineCode[8] = 0x45;
    MachineCode[9] = 0x8;
        
    MachineCode[10] = 0xF;//    'cpuid
    MachineCode[11] = 0xA2;
        
    MachineCode[12] = 0x8B;//   'mov edi,dword ptr [ebp+12]
    MachineCode[13] = 0x7D;
    MachineCode[14] = 0xC;
        
    MachineCode[15] = 0x89;//   'move dword ptr [edi],ebx
    MachineCode[16] = 0x1F;//
        
    MachineCode[17] = 0x8B;//   'mov edi,dword ptr [ebp+16]
    MachineCode[18] = 0x7D;//
    MachineCode[19] = 0x10;//
        
    MachineCode[20] = 0x89;//   'move dword ptr [edi],ecx
    MachineCode[21] = 0xF;//
        
    MachineCode[22] = 0x8B;//   'mov edi,dword ptr [ebp+20]
    MachineCode[23] = 0x7D;//
    MachineCode[24] = 0x14;//
        
    MachineCode[25] = 0x89;//   'move dword ptr [edi],edx
    MachineCode[26] = 0x17;//
        
    MachineCode[27] = 0x58;//   'pop ebx MachineCode[28] = 0x59;//   'pop ecx MachineCode[29] = 0x5A;//   'pop edx MachineCode[30] = 0x55;//   'pop edi
        
    MachineCode[31] = 0xC9;//   'leave MachineCode[32] = 0xC2;//   'ret 16     I tried everything from 0 to 24
    MachineCode[33] = 0x10;//   '           but all produce the stack error
    MachineCode[34] = 0x0;//
    }

    private static void InitializeVals() 

    int i; 
    string assemblyCode; 
                
    for ( i=0; i<=255; i++ ) 

    ValueTable[i]= ( i * 81 ) % ( 90 + i ); 

                try
    {
    assemblyCode = "558EC57565053518B45088B008B750C8B7D108B4D1433DB8A1E03049F464975F78B4D088901595B585E5F8BE55DC21000";
    AssemblyValue = new  byte[ assemblyCode.Length / 2 ]; 
    for ( i=0; i< assemblyCode.Length - 1; i+=2 ) /* TRANSWARNING: check comparison operator (negative step?) in for loop */ 

    string tmp = assemblyCode.Substring(i,2);
    AssemblyValue[i/2] = byte.Parse(tmp,System.Globalization.NumberStyles.HexNumber);

    }
    catch(Exception ep)
    {
    MessageBox.Show(ep.Message + ep.StackTrace.ToString());
    }


    }
      

  9.   

    关于CPU序列号好象同一类型的号码一样,可能你取的是ID不是序列号,序列号是唯一的吧,
    一般采用取 CPU+硬盘的,这样唯一性高点。
    不知道对不啊
      

  10.   

    C#究竟如何获取cpu序列号啊
    救命啦!
      

  11.   

    同一个批次的CPU序列号,都是一样的,不用在试了.谢谢