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)
Retrieving Hardware Identifiers in C# with WMI by Peter Bromberg
Oli*_*ver 15
如果您需要唯一ID,则必须先确定您对unique的定义.如果您希望/打算将它用于复制保护机制,那么使用简单的东西.这是因为如果有人真的想要使用你的软件,那么只要有足够的时间和技巧,他就会找到一种方法来打破你的保护.在具有唯一硬件ID的情况下,只需考虑虚拟机,您就会发现可以欺骗任何东西,以免有人篡改您的软件.
您可以从PC上获取并且在整个生命周期中将其视为唯一性.(硬件更改很可能需要在某个时刻重新生成ID.)如果您需要这样的东西,您应该使用可以发送给客户的身份验证USB Dongle进行调查.
如果您只需要一些难以获得的唯一标识符,您可以获取MAC地址(不可靠),操作系统序列号或域和用户名,但所有这些都容易被伪造.但是,如果您的主要目标是锁定未经授权的人员,那么您将不会出售任何东西,因为如果难以安装,注册或从一台PC移动到另一台PC,没有人会想要使用您的软件,尽管最后一个考虑因素是每台机器许可的一部分.(这可能会经常发生.)
作为第一步,轻松一点:使用一些简单的东西,这些东西在您的目标群体中不易被欺骗.(例如,企业客户不容易欺骗域名和用户名,因为他们的PC在更大的环境中运行实施策略等等.)只要忘记其他人,直到拥有它们.
也许你可以锁定它们,但这并不意味着它们会购买你的软件; 他们只是不再使用它了.您需要考虑的是,有多少潜在客户不愿意或不愿意支付,因为您使用该程序非常复杂.
Dun*_*yne 14
我会远离使用MAC地址.在某些硬件上,重新启动时MAC地址可能会发生变化.我们在研究期间很早就学会了不依赖它.
看看开发软件保护和许可这篇文章,其中有一些关于如何设计和实现应用程序以减少盗版的指示.
强制免责声明和插件:我共同创办的公司生产OffByZero Cobalt许可解决方案.因此,听到我建议外包您的许可并专注于您的核心竞争力,您可能不会感到惊讶.
也许最简单的方法是。获取DeviceId Nuget包
并像这样使用
string deviceId = new DeviceIdBuilder()
.AddMachineName()
.AddMacAddress()
.AddProcessorId()
.AddMotherboardSerialNumber()
.ToString();
Run Code Online (Sandbox Code Playgroud)
您可以个性化用于生成ID的信息
看看这篇文章.它非常详尽,您将找到如何提取各种硬件信息.
从文章引用:
要获取硬件信息,您需要创建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.
编辑:我刚刚看到你的意思是在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)