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

Ero*_*ocM 12 c# hardware licensing

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

  1. MAC地址
  2. CPU序列号
  3. 计算机卷序列号drive0

我假设如果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;
    }
Run Code Online (Sandbox Code Playgroud)

Edw*_*son 12

不是一个真正的答案,而是一个谨慎的话.我曾在一家软件公司工作过,它做过类似的许可机制,而且很脆弱. 尤其是笔记本电脑.考虑:

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

  2. 更改MAC地址可能有好处.例如,各州的一些有线互联网提供商愚蠢地将您的MAC地址绑定到您的帐户,并且可能需要将他们的计算机直接连接到电缆调制解调器,然后如果他们的路由器将死亡则克隆其路由器的MAC.

  3. 如果用户要从另一个硬盘驱动器(例如,闪存驱动器或USB记忆棒)启动,这会改变报告的第一个驱动器吗?

这早在商品虚拟化时代就已存在.现在考虑您可以切换设置并重新启动VM,并具有:不同数量的RAM,不同大小的硬盘驱动器,不同类型的虚拟硬盘驱动器控制器类型(IDE,SCSI,可能还有多个SCSI控制器接口).您可以通过鼠标单击热插拔CD/DVD设备并更改NIC设置.

所以我并不是说"不要这样做",但我会鼓励你在尽可能多的环境中尽可能多的机器上测试这种机制,我会进一步建议你的用户将获得宝贵的耐心当他们无法运行他们付出的软件时.

你考虑过硬件加密狗吗?


Sea*_*n U 9

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

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


Wes*_*ong 8

这是一篇关于MS如何使用Windows XP做的相当不错的文章.也许不完全是你想要的,但这是一个很好的起点.

Windows XP激活说明

Windows检查哪些硬件?

系统检查这十类硬件:

  • 显示适配器
  • SCSI适配器
  • IDE适配器(实际上是主板)
  • 网络适​​配器(NIC)及其MAC地址
  • RAM金额范围(即0-64mb,64-128mb等)
  • 处理器类型
  • 处理器序列号
  • 硬盘设备
  • 硬盘卷序列号(VSN)
  • CD-ROM/CD-RW/DVD-ROM