通过客户端的网卡号和机器名生成一个软件注册码,该注册码通过Web服务中的方法生成。运行程序时,将会自动获取客户端的网卡号和机器名,单击“生成注册码”按钮,将会调用Web服务中的生成注册码的方法实现生成注册码并返回。当单击“注册”按钮时,将调用Web服务中的分解注册码的方法,将注册码分解出网卡号、机器名和所获取的网卡号、机器名对比如果正确说明注册成功。实例运行结果如图1所示。
图1 利用Web服务在线生成软件注册码
关键技术
本实例主要用到的关键技术如下:
(1)获取客户端IP
HttpRequest类中的UserHostAddress属性用来获取远程客户端的IP主机地址,该属性的语法如下。
返回值:String类型,表示远程客户端的IP地址。
(2)获取网卡号
在ASP.NET中获取客户端网卡号,首先需要获取到客户端的IP地址,在使用进程执行nbtstat –A IPAddress命令获取到NetBIOS名称表再使用正则表达式截取到网卡号。
nbtstat命令:该命令用来显示基于TCP/IP的NetBIOS(NetBT)协议统计资料、本地计算机和远程计算机的NetBIOS名称表和NetBIOS名称缓存。该命令的语法如下。
nbtstat[-a RemoteName] [-A IPAddress] [-c] [-n] [-r] [-R] [-RR] [-s] [-S] [Interval]
在本程序中主要使用到了-A IPAddress参数,该参数说明如下。
该参数用来显示远程计算机的NetBIOS名称表,其名称由远程计算机的IP地址指定。读者可以在“开始”菜单中选择运行选项,在弹出的“运行”窗口中输入cmd命令,就会打开DOS窗口。在该窗口中输入nbtstat –A 读者机器的IP,会显示NetBIOS名称表。在该表中可以查看网卡号信息(MAC Address)。如图1所示。
图1 MAC地址信息
(3)获取机器名
Dns类Resolve方法可以获取到IPHostEntry实例,该实例中包含机器名信息。Resolve方法的语法如下。
public static IPHostEntry Resolve(string hostName)
Œ 参数hostName:为DNS样式的主机名或IP地址。
返回值:一个IPHostEntry实例,包含有关hostName中指定的主机的地址信息。
设计过程
(1)新建一个网站,将其命名为SoftwareRegister,默认主页为Default.aspx。
(2)Web服务的生成。自定义getNumber方法,该方法用来返回软件注册码。调用该方法需要传入两个字符串变量,第一个字符串变量表示客户端网卡号,第二个字符串变量表示客户端机器名。在该方法中将客户端的网卡号分成4组,将机器名分别取出一个字符添加到网卡号所分的组中。最后将数组赋值到字符串变量中并返回。实现代码如下:
[WebMethod]
public string getNumber(string carNmu, string hosNam)
{
string cardStr = carNmu.Replace(":", ""); //将字符串中“:”替换为空字符
string[] cards = new string[4]; //创建数组
int s = 0;
string hn = hosNam; //获取机器名
if (hn.Length > 4) //判断机器名是否大于4位
{
hn = hn.Substring(0, 4); //截取4位字符
}
else
{
int len = hn.Length; //获取机器名的长度
switch (len) //将机器名填充到4位
{
case 1: hn += "ABC"; break;
case 2: hn += "AB"; break;
case 3: hn += "A"; break;
}
}
hn = hn.ToUpper(); //将机器名转换为大写
for (int i = 0; i < 4; i++) //创建for循环添加数组
{
//将网卡号分成4组,在每组i的位置插入所获取的1为机器名
cards[i] = cardStr.Substring(s, 3).Insert(i, hn.Substring(i, 1));
s += 3;
}
string getRegNum = "";
for (int k = 0; k < 3; k++) //将每个数组之间插入“-”并存储在字符串变量中
{
getRegNum += cards[k] + "-";
}
return getRegNum += cards[3]; //返回所生成的注册码
}
(2)注册软件注册码的实现,在“注册”按钮的Click事件中,判断用户填写的软件注册码是否正确。在该事件中将调用Web服务中的getCar方法,将该方法返回的值通过“-”分组,在Label控件中所显示的网卡号和机器名与数组中的值进行比较,如果相同表示注册成功并给出提示信息,代码如下:
protected void btnRegion_Click(object sender, EventArgs e)
{
string strNum =txt1.Text + "-" + txt2.Text + "-" + txt3.Text+ "-" + txt4.Text; //获取用户填写的软件注册码
webGet.Service ws=new webGet.Service(); //创建web服务对象
string[] strs = ws.getCar(strNum).Split('-'); //将Web服务中的方法返回的分解值,分组
string hn = labName.Text; //获取机器名
if (hn.Length > 4) //添加机器名为四位
{
hn = hn.Substring(0, 4); //截取4位字符
}
else
{
int len = hn.Length; //获取机器名的长度
switch (len) //将机器名填充到4位
{
case 1: hn += "ABC"; break;
case 2: hn += "AB"; break;
case 3: hn += "A"; break;
}
}
//判断分解的客户端网卡号、机器名和自动获取到的客户端网卡号、机器名是否相同
if (labCard.Text.Replace(":", "") == strs[1] && hn == strs[0])
{
RegisterStartupScript("", "<script>alert('注册成功!')</script>");
}
else
{
RegisterStartupScript("", "<script>alert('注册失败!')</script>");
}
}
秘笈心法
心法领悟:注册码的由来
注册码的生成,是将机器名插入到网卡序列号中所生成的。网卡序列号是有一个12位的字符串所组成的,首先将网卡序列号分为四组,每组三个字符。在将机器名分为四组,每组一个字符。将机器名分别插入到网卡序列号所分的四组中。该机器名插入的顺序为,机器名第一组插入到网卡序列号第一组的第一位,机器名第二组插入到网卡序列号第二组的第二位。以此类推,最终生成一个注册码。

被折叠的 条评论
为什么被折叠?



