C#基于硬件ID创建一个唯一的ID

本文关键字:ID 一个 唯一 创建 硬件 于硬件 | 更新日期: 2023-09-27 18:21:34

我正在创建一个特定于机器的许可证。许可证基于以下项目:

  1. MAC地址
  2. CPU序列号
  3. 驱动器0的计算机卷序列号

我假设,如果3中的2个匹配,那么我的许可证是有效的。因此,可以获得新的网卡,并且许可证仍然有效,等等。

这是一个好方法吗?还是我会遇到不匹配或不定期更改的问题?

我正在尝试获取计算机的唯一标识符,以便验证许可证。

请告诉我这看起来怎么样,或者你是否有更好的解决方案!

再次感谢!

**这是我想出的**

我最终只使用了VolumeSerial、CpuId和VideoControllerDescription。

    public enum HardwareProfileComponents
    {
        ComputerModel,
        VolumeSerial,
        CpuId,
        MemoryCapacity,
        VideoControllerDescription
    }
    public static Dictionary<string, string> HardwareProfile()
    {
        var retval = new Dictionary<string, string>
                         {
                             {HardwareProfileComponents.ComputerModel.ToString(), GetComputerModel()},
                             {HardwareProfileComponents.VolumeSerial.ToString(), GetVolumeSerial()},
                             {HardwareProfileComponents.CpuId.ToString(), GetCpuId()},
                             {HardwareProfileComponents.MemoryCapacity.ToString(), GetMemoryAmount()},
                             {HardwareProfileComponents.VideoControllerDescription.ToString(), GetVideoControllerDescription()}
                         };
        return retval;
    }
    private static string GetVideoControllerDescription()
    {
        Console.WriteLine("GetVideoControllerDescription");
        var s1 = new ManagementObjectSearcher("select * from Win32_VideoController");
        foreach (ManagementObject oReturn in s1.Get())
        {
            var desc = oReturn["AdapterRam"];
            if ( desc == null) continue;
            return oReturn["Description"].ToString().Trim();
        }
        return string.Empty;
    }

    private static string GetComputerModel()
    {
        Console.WriteLine("GetComputerModel");
        var s1 = new ManagementObjectSearcher("select * from Win32_ComputerSystem"); 
        foreach (ManagementObject oReturn in s1.Get())
        {
            return oReturn["Model"].ToString().Trim();
        }            
        return string.Empty;
    }
    private static string GetMemoryAmount()
    {
        Console.WriteLine("GetMemoryAmount");
        var s1 = new ManagementObjectSearcher("select * from Win32_PhysicalMemory");
        foreach (ManagementObject oReturn in s1.Get())
        {
            return oReturn["Capacity"].ToString().Trim();
        }
        return string.Empty;
    }
    private static string GetVolumeSerial()
    {
        Console.WriteLine("GetVolumeSerial");
        var disk = new ManagementObject(@"win32_logicaldisk.deviceid=""c:""");
        disk.Get();
        string volumeSerial = disk["VolumeSerialNumber"].ToString();
        disk.Dispose();
        return volumeSerial;
    }
    private static string GetCpuId()
    {
        Console.WriteLine("GetCpuId");
        var managClass = new ManagementClass("win32_processor");
        var managCollec = managClass.GetInstances();
        foreach (ManagementObject managObj in managCollec)
        {
            //Get only the first CPU's ID
            return managObj.Properties["processorID"].Value.ToString();
        }
        return string.Empty;
    }

C#基于硬件ID创建一个唯一的ID

这不是一个真正的答案,而是一个警告。我在一家软件公司工作,该公司也有类似的许可机制,它。。。脆性尤其是在笔记本电脑上。考虑:

  1. 在笔记本电脑上切换有线和无线时,每个接口上都会有不同的MAC地址。

  2. 更改MAC地址可能有好处。例如,美国的一些有线互联网提供商愚蠢地将你的MAC地址与你的帐户绑定,如果他们的路由器坏了,他们可能需要将计算机直接插入有线调制解调器,然后克隆路由器的MAC。

  3. 如果用户从不同的硬盘(例如,闪存驱动器或U盘)启动,这会改变报告的第一个驱动器吗?

这早在商品虚拟化时代之前。现在考虑一下,您可以切换设置并重新启动VM,并拥有:不同数量的RAM、不同大小的硬盘驱动器、不同类型的虚拟硬盘驱动器控制器类型(IDE、SCSI,也许还有多个SCSI控制器接口)。您可以热插拔CD/DVD设备,只需单击鼠标即可更改NIC设置。

因此,我并不是说"不要这样做",确切地说,但我鼓励您在尽可能多的环境中的尽可能多机器上测试这种机制,我还建议当您的用户无法运行他们付费购买的软件时,他们将几乎没有耐心

你考虑过硬件加密狗吗?

我发现MAC地址现在真的不值得检查了。每台计算机都有一个以上的网络适配器,其中任何一个都可能是在任何给定时间存在或不存在的外部设备。几年前,我们推出了一个过于关注MAC地址的系统,但它最终成为了一场客户服务灾难。

另一方面,更换CPU、主板、总线/磁盘控制器或主硬盘驱动器的情况相对较少。

这是一篇关于MS如何在Windows XP中做到这一点的相当不错的文章。也许不是你想要的,但这是一个很好的起点。

Windows XP激活解释

Windows检查什么硬件?

系统检查以下十类硬件:

  • 显示器适配器
  • SCSI适配器
  • IDE适配器(实际上是主板)
  • 网络适配器(NIC)及其MAC地址
  • RAM数量范围(即0-64mb、64-128mb等)
  • 处理器类型
  • 处理器序列号
  • 硬盘驱动器设备
  • 硬盘驱动器卷序列号(VSN)
  • 光盘/光盘/DVD光盘