C# Mac或主板作为唯一标识符用于许可目的?

C# Mac或主板作为唯一标识符用于许可目的?,c#,.net,visual-studio-2010,hardware,C#,.net,Visual Studio 2010,Hardware,好的,所以我使用MAC地址作为唯一标识符,一切都很顺利,直到我激活了VPN,MAC地址发生了变化 因此,我有两个选择: 1) 获取实际物理网卡的MAC地址 对于mac地址,我找到了一些关于如何实现这一点的提示: 2.)获取主板ID并使用它,希望我们不会得到两台具有相同ID的计算机(可能吗?) 你怎么说?我应该试着挖掘并找到从卡上而不是虚拟卡上获取mac地址的代码,还是应该切换到主板上?我不需要组合任何东西,我只需要在目标计算机上不容易更改的东西。如果您可以使用主板、NIC和硬盘驱动器的值

好的,所以我使用MAC地址作为唯一标识符,一切都很顺利,直到我激活了VPN,MAC地址发生了变化

因此,我有两个选择:

1) 获取实际物理网卡的MAC地址

对于mac地址,我找到了一些关于如何实现这一点的提示:

2.)获取主板ID并使用它,希望我们不会得到两台具有相同ID的计算机(可能吗?)


你怎么说?我应该试着挖掘并找到从卡上而不是虚拟卡上获取mac地址的代码,还是应该切换到主板上?我不需要组合任何东西,我只需要在目标计算机上不容易更改的东西。

如果您可以使用主板、NIC和硬盘驱动器的值的组合,那就更好了


您可以查看这篇文章:

使用microsoft为此提供的一些工具。它们使用硬件标识符的组合。Mac电脑不好,因为它们通常可以更换。微软一定会有一些唯一的安装标识符


我认为类似于以下的方法将是最安全的

  • 您为用户提供软件的许可证密钥,该密钥与客户名称或公司等相关
  • 用户在程序中输入此数据
  • 每次程序启动时,它都会“打电话回家”发送许可信息
  • 如果许可证(由您的系统)验证为有效,软件将收到一些数据,这些数据实际上使其能够运行。否则,无论发生什么情况,它都无法工作(某些部件将丢失)

  • 一个例子(我想从现在开始C)就是,除非获得许可,否则无法运行,这将是使用一些基本方法
    extern
    。您将发送所需的程序集以响应有效的许可证,或退回到“Gotcha!”警告。

    我个人将执行以下操作

  • 抓取一些硬件键

  • UUID
  • 序列号
  • 硬盘序列号
  • 物理MAC地址(有关如何使用此地址的提示,请参见我的此处)
  • 允许其中一个(甚至两个)更改,同时保持许可证的有效性

  • 需要重新激活您的许可证
  • 跟踪客户的重新激活次数,并在怀疑之前达到某种最大值
  • 不要使用WMI我估计至少有1/10次它不起作用。您需要绕过WMI并使用Windows API获取这些硬件详细信息


    个人开发了一些类似的东西,它跟踪10种不同的东西(包括软件属性),带有一些允许更改的逻辑。在第一个版本中,WMI的使用完全失败。

    别忘了MAC地址可以通过编程或更改NIC轻松更改。我认为这样做是浪费精力——你故意花时间编写反功能,这些功能很少被盗版软件绕过。当它不能正常工作时,它唯一能做的就是惹恼你的付费客户。最好花些时间添加一些功能,让人们相信你的软件很棒,值得花钱购买。@Flexo:我明白你的意思,但我不同意。当然,技术娴熟的“海盗”可以很容易地绕过这一点,但这超出了重点。这一点是为了刺激临时用户为产品付费。如果有人决心破坏程序,他们会的,如果有人决心找到漏洞,他们会的,但那不是你的客户。临时客户也会偶尔更换他们的机器。您确定要将软件按许可证绑定到一台计算机上吗?您将如何允许将许可证转移到新机器上?@DanPuzey:是的,当他们将许可证从一台机器转移到另一台机器上时,问题就出现了,但主板id不是一个好主意吗?请记住,您是在识别特定的操作系统安装,而不是硬件,而不是用户。是的。但是硬件是一个不好的授权目标。我也不会使用这种跟踪来自动强制授权,只是打电话回家,确保人们只对一个活动安装使用一个许可证密钥。WMI是一个糟糕的主意,它很可能在你的目标机上不起作用。
    public String getMotherBoardID()
    {
        String serial = "";
        try
        {
            ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard");
            ManagementObjectCollection moc = mos.Get();
    
            foreach (ManagementObject mo in moc)
            {
                serial = mo["SerialNumber"].ToString();
            }
            return serial;
        }
        catch (Exception)
        {
            return serial;
        }
    }