65.9K
CodeProject 正在变化。 阅读更多。
Home

基于硬件代码创建序列号的简单应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (10投票s)

2016年8月4日

CPOL

3分钟阅读

viewsIcon

30712

downloadIcon

1358

这是一个基于HDD硬件代码创建序列号的简单应用程序。 它具有序列号应用程序的3个必要部分(请求代码,获取序列号和确认)。

引言

为开发的应用程序创建序列号是所有开发人员普遍关心的问题。 创建应用程序的唯一序列号的最流行方法之一是基于硬件资源代码创建序列号。 如您所知,所有硬件资源都有其自己唯一的序列号(例如NIC,HDD等)。
在本文中,我将尝试创建一个基于HDD硬件代码的3部分序列号。 该应用程序包括3个部分:1.获取请求代码 2.基于HDD硬件代码生成序列号 3.使用HDD硬件代码确认序列号和请求代码。

使用代码

正如我描述的,代码包括3个部分;


1.    生成请求代码。

请求代码已基于HDD硬件代码创建。 有一个非常简单的方法可以返回HDD硬件代码。 此方法使用System.Management命名空间中包含的ManagementObjectSearcher类。

    private string GetHDDSerialNumber()
        {
            string outs = "";

            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_DiskDrive");
            foreach (ManagementObject queryObj in searcher.Get())
            {
                string a = queryObj["PNPDeviceID"].ToString();

                if (a.Substring(0, 3) != "USB")
                    outs = (queryObj["PNPDeviceID"]).ToString();
            }

            string s = "";
            foreach (char t in outs)
            {
                int i;
                if (int.TryParse(t.ToString(), out i))
                    s += t.ToString();
            }

            return s;
        }

ManagementObjectSearcher is one of the more commonly used entry points to retrieving management information. For example, it can be used to enumerate all disk drives, network adapters, processes and many more management objects on a system, or to query for all network connections that are up, services that are paused, and so on.

因此,当用户单击GetRequestCode按钮时,按钮的事件处理程序从GetHDDSerialNumber方法获取HDD代码,并将其转换为Base64字符串。

2.    获取序列号

在通常情况下,客户端或用户在安装后创建一个请求代码,并将该代码发送给应用程序所有者(通过Web或电子邮件等)。 应用程序所有者将发回一个基于请求代码创建的序列号。

此示例的第二部分是生成基于请求代码的唯一序列号。 所有序列号都需要两个主要因素:1.种子(这里我们的种子是HDD硬件代码) 2.将基于该种子创建序列号的算法。
好的,当您单击“生成序列号”按钮时,处理程序会从文本框中读取请求,并将其转换为double。

byte[] requestCodeByte = Convert.FromBase64String(txtRequestCode.Text);
string requestCode = string.Empty;

foreach (byte b in requestCodeByte)
{
requestCode += b.ToString();
}

long requestCodeDouble = Convert.ToInt64(requestCode); 

在此示例中,我使用3个简单的数学函数来创建一个3部分的序列号。 您可以使用自己的算法来创建自己的序列号。

long p1 = requestCodeDouble * requestCodeDouble - 2 * requestCodeDouble;
long p2 = (requestCodeDouble - 2) * (requestCodeDouble - 1);
long p3 = (requestCodeDouble + 2 * requestCodeDouble);

在此方法的最新部分中,我使用string.format创建一个序列号字符串。

txtSerialNumber.Text = string.Format("{0}-{1}-{2}", p1, p2, p3);

 

3.    确认序列号

应用程序的最后重要部分是确认序列号。 此函数检查2个条件。 首先检查请求代码和HHD代码是否相等。 第二检查所有序列号部分是否正确。
它是处理程序的第一个部分,已检索到当前计算机的请求代码。
string thisComputerHddSerialNumber = GetHDDSerialNumber();
byte[] thisComputerRequestCode = new byte[thisComputerHddSerialNumber.Length];
int counter = 0;
foreach (char c in thisComputerHddSerialNumber.ToArray())
{
    thisComputerRequestCode[counter] = Convert.ToByte(c.ToString());
    counter++;
}
string thisComputerRequestCodeString = Convert.ToBase64String(thisComputerRequestCode);

long p1 = userRequestCodeDouble * userRequestCodeDouble - 2 * userRequestCodeDouble;
long p2 = (userRequestCodeDouble - 2) * (userRequestCodeDouble - 1);
long p3 = (userRequestCodeDouble + 2 * userRequestCodeDouble);


在处理程序方法的第二部分中,用户的请求代码已转换为double变量。 请注意,在此示例中,我们在同一台计算机上运行此应用程序的三个不同部分。 但是,在实际使用序列号应用程序时,该应用程序具有在2或3台不同计算机上运行的3个不同部分。 因此,这就是为什么我们需要再次检索当前计算机的请求代码。 实际上,我们将用户序列号和请求代码与基于系统硬件的正确序列号和请求代码进行了比较。

byte[] userNumberByte = Convert.FromBase64String(txtRequestCode.Text);
string userRequestCode = "";
foreach (byte b in userNumberByte)
{
    userRequestCode += b.ToString();
}
long userRequestCodeDouble = Convert.ToInt64(userRequestCode);
string[] parts = txtSerialNumber.Text.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
long p1c = Convert.ToInt64(parts[0]);
long p2c = Convert.ToInt64(parts[1]);
long p3c = Convert.ToInt64(parts[2]);


现在你拥有了你需要的一切;
a.    用户序列号部分
b.    用户请求代码
c.    当前系统序列号
d.    当前系统请求代码
在这里,您只需要比较这些变量。

if (p1c == p1 && p2c == p2 && p3c == p3 && userRequestCode == txtRequestCode.Text)
{
    lblResult.Text = "Correct";
}
else
{
    lblResult.Text = "Wrong";
}

 

关注点

我这个项目中学到了"ManagementObjectSearcher" 对象。 当您需要使用硬件代码时,它非常有用。

© . All rights reserved.