如何获得服务器的cpu全球唯一的id序列码?告诉我理论及方法!

解决方案 »

  1.   

    cpu ID
    type
       TCPUID  = array[1..4] of Longint;function GetCPUID : TCPUID; assembler; register;     //得到CPU序列号
    asm
      PUSH    EBX         {Save affected register}
      PUSH    EDI
      MOV     EDI,EAX     {@Resukt}
      MOV     EAX,1
      DW      $A20F       {CPUID Command}
      STOSD           {CPUID[1]}
      MOV     EAX,EBX
      STOSD               {CPUID[2]}
      MOV     EAX,ECX
      STOSD               {CPUID[3]}
      MOV     EAX,EDX
      STOSD               {CPUID[4]}
      POP     EDI {Restore registers}
      POP     EBX
    end;
      

  2.   

    静态产生方法:
    在 DELPHI 的代码编辑窗体中按 CTRL + SHIFT + G
    动态产生方法:uses ole2;
    var 
      G: TGUID;
      UID: string;
    begin
      CoCreateGuid(G);
      UID := GuidToString(G);
      

  3.   

    //取Cpu的ID号,代码如下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      R: array[0..19] of Char;
      CpuID: Integer;
    begin
      FillChar(R, 20, 0);
      asm
        mov eax, 0
        db 0fh, 0a2h
        mov dword ptr R[0],  ebx
        mov dword ptr R[4],  edx
        mov dword ptr R[8],  ecx
        mov eax, 1
        db 0fh, 0a2h               // cpuid
        mov CpuID, edx
      end;
      ShowMessage('CPU制造商为:' + R);
      ShowMessage('序列号为:' + IntToStr(CpuID));
    end;
      

  4.   

    以前有过类似的帖子,你search一下吧
      

  5.   

    //网上找的
    unit CPUID;interfacetype
      TCPUID = array[1..4] of Longint;
      TCPUVendor = array[0..11] of Char;function GetCPUID: TCPUID; assembler; register;
    function GetCPUVendor: TCPUVendor; assembler; register;implementationfunction GetCPUID: TCPUID; assembler; register;
    asm
      PUSH    EBX         {Save affected register}
      PUSH    EDI
      MOV     EDI,EAX     {@Resukt}
      MOV     EAX,1
      DW      $A20F       {CPUID Command}
      STOSD               {CPUID[1]}
      MOV     EAX,EBX
      STOSD               {CPUID[2]}
      MOV     EAX,ECX
      STOSD               {CPUID[3]}
      MOV     EAX,EDX
      STOSD               {CPUID[4]}
      POP     EDI         {Restore registers}
      POP     EBX
    end;function GetCPUVendor: TCPUVendor; assembler; register;
    asm
      PUSH    EBX         {Save affected register}
      PUSH    EDI
      MOV     EDI,EAX     {@Result (TVendor)}
      MOV     EAX,0
      DW      $A20F       {CPUID Command}
      MOV     EAX,EBX
      XCHG    EBX,ECX     {save ECX result}
      MOV     ECX,4
    @1:
      STOSB
      SHR     EAX,8
      LOOP    @1
      MOV     EAX,EDX
      MOV     ECX,4
    @2:
      STOSB
      SHR     EAX,8
      LOOP    @2
      MOV     EAX,EBX
      MOV     ECX,4
    @3:
      STOSB
      SHR     EAX,8
      LOOP    @3
      POP     EDI         {Restore registers}
      POP     EBX
    end;end.
      

  6.   

    用 程 序 取 得 CPU 信 息重 庆 杨 家 坪 毛 线 沟 第 九 建 筑 公 司 
    李 涛 ----很多软件可以判断所运行的电脑类型而自动做不同的处理。如PhotoShop5可以探测CPU是否有MMX支持而调用不同的处理函数,《金山词霸》发现有MMX支持会产生半透明的翻译提示,很多软件可以区分Intel,Cyrix,AMD的CPU... ----现在,且让我细细道来如何让你在自己的程序中取得CPU信息。 ----主要可利用CPUID汇编指令(机器码:0FHA2H,如果你的编译器不支持CPUID指令,只有emit机器码了)该指令可以被如下CPU识别                     Intel 486 以 上 的CPU,                     Cyrix M1 以 上 的CPU,                     AMD Am486 以 上 的CPU 
      (1)取CPUOEM字符串,判断CPU厂商 先让EAX=0,再调用CPUID     Inel 的CPU 将 返 回:                     EBX:756E6547H 'Genu'                     EDX:49656E69H 'ineI'                     ECX:6C65746EH 'ntel'                     EBX,EDX,ECX 将 连 成"GenuineIntel", 真 正 的Intel。    Cyrix 的CPU 将 返 回:                     EBX:43797269H                     EDX:78496E73H                     ECX:74656164H                     "CyrixInstead","Cyrix 来 代 替"。    AMD 的CPU 将 返 回:                     EBX:41757468H                     EDX:656E7469H                     ECX:63414D44H                     "AuthenticAMD", 可 信 的AMD。 
      ----在Windows98中,用右键单击"我的电脑",选择"属性-常规"在计算机描述处就可看见CPUOEM字符串。 (2)CPU到底是几86,是否支持MMX 先让EAX=1,再调用CPUID EAX的8到11位就表明是几86                     3 - 386                     4 - i486                     5 - Pentium                     6 - Pentium Pro Pentium II                     2 - Dual Processors    EDX 的第0位:有无FPU    EDX 的第23位:CPU是否支持IA MMX,很重要啊!如果你想用那57条新增的指令,先检查这一位吧,否则就等着看Windows的"该程序执行了非法指令,将被关闭"吧。 (3)专门检测是否P6架构    先让EAX=1,再调用CPUID     如果AL=1,就是PentiumPro或Pentium II (4)专门检测AMD的CPU信息     先 让EAX=80000001H, 再 调 用CPUID     如 果EAX=51H, 是AMD K5     如 果EAX=66H, 是K6     EDX 第0 位: 是 否 有FPU     EDX 第23 位,CPU 是 否 支 持MMX,程序如下:是C++Builder的控制台程序,可以给出你的"心"的信息。如果把这个技术用于DLL中,便可以使VB程序也知道"心"的信息。                     //------CPUID Instruction Demo Program------------ 
                        #include < conio.h > 
                        #include < iostream.h > 
                        #pragma hdrstop 
                        //------------------------------------------------                     #pragma inline 
                        #pragma argsused                     int main(int argc, char **argv) 
                        { 
                        char OEMString[13]; 
                        int iEAXValue,iEBXValue,iECXValue,iEDXValue;                     _asm { 
                             mov eax,0 
                             cpuid 
                             mov DWORD PTR OEMString,ebx 
                             mov DWORD PTR OEMString+4,edx 
                             mov DWORD PTR OEMString+8,ecx 
                             mov BYTE PTR OEMString+12,0 
                              }                     cout< < "This CPU 's OEM String is:"< < OEMString< < endl;                     _asm { 
                            mov eax,1 
                            cpuid 
                            mov iEAXValue,eax 
                            mov iEBXValue,ebx 
                            mov iECXValue,ecx 
                            mov iEDXValue,edx 
                              }                     if(iEDXValue&0x800000) 
                           cout < < "This is MMX CPU"< < endl; 
                        else 
                           cout < < "None MMX Support."< < endl;                     int iCPUFamily=(0xf00 & iEAXValue) > >8; 
      
                        cout < < "CPU Family is:"< < iCPUFamily< < endl; 
      
                        _asm{ 
                            mov eax,2 
                            CPUID 
                             }                     if(_AL==1) 
                           cout < < "Pentium Pro or Pentium II Found";                     getch();                     return 0;            }
      

  7.   

    zlyanyan(zl) 你的代码好像不能运行啊
      

  8.   

    hammer_shi(@农业专家@) 你的方法好像也不行啊,运行后我的showmessage就不能用了,如果不运行你的代码就正常,为什么啊?
    谁能告诉我你们从什么地方得到获取cpu唯一吗的办法的啊?
      

  9.   

    zdcnow(磁效应) 为什么你产生的cpuid和 gwsr(咩咩) 产生的不一样呢?它的第四个数组元素和你的结果一样?为什么呢?
      

  10.   

    看不懂gwsr(咩咩)的代码。
    关注。
      

  11.   

    问个小问题,2000下可以用asm么?我的怎么老是出错?
      

  12.   

    答 gardenyang(太阳雨)
       zdcnow(磁效应) 为什么你产生的cpuid和 gwsr(咩咩) 产生的不一样呢?它的第四个数组元素和你的结果一样?为什么呢?  那是因为 CpuID 由四个整数组成. zdcnow(磁效应) 取的是最后一个值.
    答 gardenyang(太阳雨) 
       hammer_shi(@农业专家@) 你的方法好像也不行啊,运行后我的showmessage就不能用了,如果不运行你的代码就正常,为什么啊?
      
      我在WIN2000下测试通过能用.但有点总是,经过这样处理就行了.
      TmpS1:= 'CPU制造商为:' + R;
      SetLength(TmpS2, Length(TmpS1));
      For I:=1 To Length(TmpS1) Do TmpS2[I]:= TmpS1[I];
      Memo1.Lines.Add(TmpS2);  TmpS1:= '序列号为:' + IntToHex(CpuID, 8);
      Memo1.Lines.Add(TmpS1);
      
       
     
      

  13.   

    我再来顶一下.不知那位兄弟可以获得主板BIOS的相关信息以及主板的序列号等.要在WIN2000下运行通过的哟.谢谢.
      

  14.   

    感谢 Maple119(枫叶) 啊,我是不是可以用咩咩的方法呢?不过还是有一个疑问,cpuid为什么是由4为整数组成的呢?每一个整数分别代表什么意思?第四位是不是可以已经全球唯一,而前三位只是某个信息的特定含义呢?希望能够回答我!谢谢!
      

  15.   

    我的结构是正确的,我写的那个函数你可以在DELPHI的帮助里看看的,我再帮你看看把,不过这两天我要出差了,还有有CRL+组合键得到的 事随机的,所有不同了。