有时候我们开发了一款软件并提供客户使用,但又不希望被随便拷贝传播,这时候就需要增加软件授权功能。
我们的目的很明确,只允许被授权的电脑使用,禁止拷贝传播。
那么我们只要找到电脑里具有独一无二的特征就可以了,这样的特征信息其实很多,CPU,硬盘,网卡MAC等都是独一无二的,这里我们就只使用硬盘的方式作为示范。
使用VS新建的C#桌面项目,应用程序入口main()函数,它是在Program.cs里,可以看到默认的main()函数里直接启动uart窗体了。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new uart());
}
如果我们需要增加授权的话,可以在Application.Run(new uart())前面增加授权判断功能,这里我们只使用了C盘的方式。
//取得设备硬盘的卷标号
public static string GetDiskVolumeSerialNumber()
{
ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid='C:'");
disk.Get();
return disk.GetPropertyValue("VolumeSerialNumber").ToString();
}
现在,在Application.Run(new uart())前,我们先判断一下授权文件是否存在,如果存在则启动窗体,否则要求授权。授权成功后会生成一个授权文件,授权的方式可以自己设定,我这里就直接用当前时间和C盘序列号换算成数值相加了。事实上,我们还可以在这里设定授权的有效期,即授权了也不能永久使用。话不多说,看代码。
if (System.IO.File.Exists(passfilename) == true)
{
StreamReader read = new StreamReader(passfilename, System.Text.Encoding.GetEncoding("GB2312"));
string time = read.ReadLine();
read.Close();
DateTime registerTime = Convert.ToDateTime(time);
DateTime deadline = registerTime.AddYears(1);//设定有效期一年
if (DateTime.Compare(DateTime.Now, deadline) < 0)
{
Application.Run(new uart());
}
else/*此段不添加则过期永久失效*/
{
string disknumstr = GetDiskVolumeSerialNumber();
string pass = Interaction.InputBox("Software Has Expired,You Need To Register\r\nYour UserID Is " + disknumstr + "\r\nInput Your Key", "Key", "", 600, 400);
ulong disknum = Convert.ToUInt64(disknumstr, 16);
ulong timenum = (UInt64)DateTime.Now.Date.Ticks;
ulong passnum = disknum + timenum;
if (pass == passnum.ToString("X2"))
{
StreamWriter log = new StreamWriter(passfilename, false);
log.Write(DateTime.Now.ToString());
log.Close();
FileInfo info = new FileInfo(passfilename);
Application.Run(new uart());
}
}
}
else
{
string disknumstr = GetDiskVolumeSerialNumber();
string pass = Interaction.InputBox("Software Has Expired,You Need To Register\r\nYour UserID Is " + disknumstr + "\r\nInput Your Key", "Key", "", 600, 400);
ulong disknum = Convert.ToUInt64(disknumstr, 16);
ulong timenum = (UInt64)DateTime.Now.Date.Ticks;
ulong passnum = disknum + timenum;
if (pass == passnum.ToString("X2"))
{
StreamWriter log = new StreamWriter(passfilename, false);
log.Write(DateTime.Now.ToString());
log.Close();
FileInfo info = new FileInfo(passfilename);
Application.Run(new uart());
}
}
现在初次运行后会弹出如下提示,只要输入授权码后即可使用,这个弹框用到的是VB中的Interaction.InputBox,因此需要添加VB命名空间using Microsoft.VisualBasic。