得到唯一的机器ID

ush*_*ush 34 c# system

我想获得独特的不可更改的机器ID像计算机的处理器序列号,用于分发软件而不进行复制.

我尝试使用处理器序列号和硬盘序列号,格式化并重新安装后,所有这些都在改变.

知道我怎么能得到一个不可更改的计算机序列号?

PRR*_*PRR 16

You can use WMI Code creator. I guess you can have a combination of "keys" (processorid,mac and software generated key).

using System.Management;
using System.Windows.Forms;

try
{
     ManagementObjectSearcher searcher = 
         new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor"); 

     foreach (ManagementObject queryObj in searcher.Get())
     {
         Console.WriteLine("-----------------------------------");
         Console.WriteLine("Win32_Processor instance");
         Console.WriteLine("-----------------------------------");
         Console.WriteLine("Architecture: {0}", queryObj["Architecture"]);
         Console.WriteLine("Caption: {0}", queryObj["Caption"]);
         Console.WriteLine("Family: {0}", queryObj["Family"]);
         Console.WriteLine("ProcessorId: {0}", queryObj["ProcessorId"]);
     }
}
catch (ManagementException e)
{
    MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
Run Code Online (Sandbox Code Playgroud)

Win32_Processor

Retrieving Hardware Identifiers in C# with WMI by Peter Bromberg


Oli*_*ver 15

如果您需要唯一ID,则必须先确定您对unique的定义.如果您希望/打算将它用于复制保护机制,那么使用简单的东西.这是因为如果有人真的想要使用你的软件,那么只要有足够的时间和技巧,他就会找到一种方法来打破你的保护.在具有唯一硬件ID的情况下,只需考虑虚拟机,您就会发现可以欺骗任何东西,以免有人篡改您的软件.

您可以从PC上获取并且在整个生命周期中将其视为唯一性.(硬件更改很可能需要在某个时刻重新生成ID.)如果您需要这样的东西,您应该使用可以发送给客户的身份验证USB Dongle进行调查.

如果您只需要一些难以获得的唯一标识符,您可以获取MAC地址(不可靠),操作系统序列号或域和用户名,但所有这些都容易被伪造.但是,如果您的主要目标是锁定未经授权的人员,那么您将不会出售任何东西,因为如果难以安装,注册或从一台PC移动到另一台PC,没有人会想要使用您的软件,尽管最后一个考虑因素是每台机器许可的一部分.(这可能会经常发生.)

作为第一步,轻松一点:使用一些简单的东西,这些东西在您的目标群体中不易被欺骗.(例如,企业客户不容易欺骗域名和用户名,因为他们的PC在更大的环境中运行实施策略等等.)只要忘记其他人,直到拥有它们.

也许你可以锁定它们,但这并不意味着它们会购买你的软件; 他们只是不再使用它了.您需要考虑的是,有多少潜在客户不愿意或不愿意支付,因为您使用该程序非常复杂.

  • 此问题比仅防复制软件更有用.所以你不应该只是问这个人.我正面临同样的问题,试图获得每台机器的唯一ID,我甚至没有远程假装出售我的软件.USB-dongle是否可以在世界任何地方分发的软件?继续做梦. (27认同)
  • 我来这里是出于安全原因,而非许可-我需要使用某些计算机专用密钥对用户数据进行加密,以使如果被盗(例如通过网络钓鱼)被盗用,则无法将其取回。 (3认同)

Dun*_*yne 14

我会远离使用MAC地址.在某些硬件上,重新启动时MAC地址可能会发生变化.我们在研究期间很早就学会了不依赖它.

看看开发软件保护和许可这篇文章,其中有一些关于如何设计和实现应用程序以减少盗版的指示.

强制免责声明和插件:我共同创办的公司生产OffByZero Cobalt许可解决方案.因此,听到我建议外包您的许可并专注于您的核心竞争力,您可能不会感到惊讶.

  • 我同意那个.MAC地址非常不可靠.mac地址列表可能会根据计算机连接到Internet的方式而改变.此外,主适配器可能会在每次启动机器时更改.CISCO VPN等服务进一步使问题复杂化. (4认同)

Dan*_*iel 6

也许最简单的方法是。获取DeviceId Nuget包

并像这样使用

string deviceId = new DeviceIdBuilder()
.AddMachineName()
.AddMacAddress()
.AddProcessorId()
.AddMotherboardSerialNumber()
.ToString();
Run Code Online (Sandbox Code Playgroud)

您可以个性化用于生成ID的信息

Github项目


Lau*_*ble 5

看看这篇文章.它非常详尽,您将找到如何提取各种硬件信息.

文章引用:

要获取硬件信息,您需要创建ManagementObjectSearcher类的对象.

using System.Management;
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + Key);
foreach (ManagementObject share in searcher.Get()) {
    // Some Codes ...
}
Run Code Online (Sandbox Code Playgroud)

上面代码的键是一个用适当的数据替换的变量.例如,要获取CPU的信息,必须用Win32_Processor替换Key.


Bli*_*ndy 3

编辑:我刚刚看到你的意思是在c#中。这是使用非托管代码的更好方法:

ManagementClass oMClass = new ManagementClass ("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection colMObj = oMCLass.GetInstances();
foreach(ManagementObject objMO in colMObj)
    Console.WriteLine(objMO["MacAddress"].ToString());
Run Code Online (Sandbox Code Playgroud)

  • 如果处理器/硬盘序列号不够,那么这就是您剩下的全部了。如果他描述他想做什么而不是他想如何做,我可能会得到更好的答复。 (4认同)
  • 您知道 MAC 地址也是“可欺骗的”吗?另外,你的代码看起来像C++,而不是C#? (2认同)