我想要获得机器码等,必须要能读取硬件的某个参数,并且读出来的是唯一的能和其它机器区分的。目前有那几种方法了:1、网卡mac,可是这个东西经常读出来的是用户上网的虚拟卡mac,很多用户都一样,就算读出来的是物理的,本机的,如有2个网卡,如果用户设置禁用了一个网卡,那机器没变读出来的mac和以前的也不一样了。2、盘序列号,可是这个没有工业标准,不能保证唯一,听说有的硬盘还读不出来。3、cpu,主板的序列号都不能保证唯一。怎么办了?目前一些商业软件不知道是如何处理的?他们用机器码、注册码等,单我想如果不能读出硬件唯一号是无法实现的,请个位同仁给点意见,谢谢。

解决方案 »

  1.   

    Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
    Global GetVal As Long              '注册    '<<< 读取是否注册的信息,如何控制这里不再说明
        Dim TempStr1 As String * 256
        Dim TempStr2 As String * 256
        Dim TempLon1 As Long
        Dim TempLon2 As Long
        Call GetVolumeInformation("C:", TempStr1, 256, GetVal, TempLon1, TempLon2, TempStr2, 256)
        '>>>    '提取本机C盘的序列号至文本框一
        Text1.Text = GetVal
      

  2.   

    liujiayu10:你好,你读取的c盘的序列号吧,右击C盘,点击属性菜单能看到这个序列号吗?我听说整个硬盘有序列号,还有id号,这2个是不同的,如何读取了?还有你这个API函数,我用c#写程序,如何使用了?指点一下啊,谢谢
      

  3.   

    c#可以通过 读取机器的硬盘,cpuid,和网卡物理地址
            //获取cpuid
            private string GetCpuID()
            {
                string CpuInfo = "";
                ManagementClass cimobject = new
                           ManagementClass("Win32_Processor");
                ManagementObjectCollection moc = cimobject.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    CpuInfo = mo.Properties["ProcessorId"].Value.ToString();
                }
                return CpuInfo;
            }
            //获取硬盘id
            private string GetHardID()
            {
                string HDInfo = "";
                ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
                ManagementObjectCollection moc1 = cimobject1.GetInstances();
                foreach (ManagementObject mo in moc1)
                {
                    HDInfo = (string)mo.Properties["Model"].Value;
                }
                return HDInfo;
            }
            //获取网卡物理地址
            private string GetMacAddress()
            {
                string MacAddress = "";
                ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection moc2 = mc.GetInstances();
                foreach (ManagementObject mo in moc2)
                {
                    if ((bool)mo["IPEnabled"] == true)
                        MacAddress = mo["MacAddress"].ToString();
                    mo.Dispose();
                }
                return MacAddress;
            }
    不过cpuid 同一批的cpu是一样的,而网卡物理地址是可以更改的,只有硬盘编号是不能改的,重装了也不行,所以推荐用硬盘id,读取之后可以用md5加密,就生成了唯一的序列号
      

  4.   

    to:5楼,你这个读取硬盘id的方法我试了下,实际读取的是硬盘的型号,和优化大师读取的一样,都是型号,那同一厂家同一批次的硬盘型号应该是一样的,缺乏唯一性。真正读取硬盘Id的方法是什么了?