请问C#取获取CPU序列号和硬盘老是变是怎么回事。

我想做软件授权。然后用下面方法生成一个序列号
/// <summary>
/// 获取软件序列号
/// </summary>
/// <returns></returns>
public string GetSoftId()
{
string softId = GetCPUID() + GetHardID();
return softId.ToMD5Encryption();
}

/// <summary>
/// 获取CPU序列号
/// </summary>
/// <returns></returns>
public string GetCPUID()
{
string cpuInfo = "";//cpu序列号
ManagementClass cimobject = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = cimobject.GetInstances();
foreach (ManagementObject mo in moc)
{
cpuInfo = cpuInfo + mo.Properties["Name"].Value.ToString();
}

return cpuInfo;
}

/// <summary>
/// 获取硬盘ID
/// </summary>
/// <returns></returns>
public string GetHardID()
{
String HDid = "";
ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
ManagementObjectCollection moc1 = cimobject1.GetInstances();
foreach (ManagementObject mo in moc1)
{
HDid = HDid + (string)mo.Properties["Model"].Value.ToString();
}

return HDid;
}

/// <summary>
/// 返回MD5加密后的字符
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ToMD5Encryption(this string str)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
}
我先是使用 GetSoftId()方法生成一个序列号,然后将这个序列号RSA加密后存在系统目录下的一个txt文件中。用户在运行系统时,先还是使用 GetSoftId()方法取这个序列号,再通过同一个RSA私钥加密后再与txt中的文件内容对比,不匹配的话就提示需要重新注册。

一个很奇怪的问题,在用户那边注册后,重启下电脑又不行了,有时甚至不重启电脑,登出系统再登入就不行了,提示要重新注册。请问大家这种情况问题最有可能出在什么地方?
...全文
630 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
足球中国 2015-09-15
  • 打赏
  • 举报
回复
这个取的就是一个注册表项,可以随意修改的。
sunny906 2015-09-14
  • 打赏
  • 举报
回复
特别是部署给不同区域的不同用户(如果是成千上万的用户),用ManagementClass取硬件编号的话简直就是灾难,就拿取硬盘来说,就如6L所说的你必须考虑外设(如U盘,移动硬盘等等),所以用汇编取吧,虽然它也受到诸如硬件型号之类的限制,但至少比ManagementClass稍微好些
  • 打赏
  • 举报
回复
多谢各位了,我再改下试试。
sunny906 2015-09-14
  • 打赏
  • 举报
回复
http://blog.csdn.net/sunny906/article/details/38082189 用汇编,ManagementClass经常取不到硬盘编号不说,取同一台机器只有一个网卡的MAC地址也是变来变去,这个问题我之前也遇到过,而且取硬盘编号应该用Win32_PhysicalMedia而不是Win32_DiskDrive
於黾 2015-09-14
  • 打赏
  • 举报
回复
引用 4 楼 wggfcusmq 的回复:
而我和同事的的电脑都是单cpu单硬盘,所以怎么测试都不会有问题。
所以你应该多找几台不同配置的电脑进行测试,而不是仅仅在开发环境里测试通过就敢发布给用户了 找几台多CPU,多硬盘的机器,看到底是因为每次读取顺序不同,还是根本是因为硬盘数量发生了变化了
於黾 2015-09-14
  • 打赏
  • 举报
回复
引用 2 楼 wggfcusmq 的回复:
[quote=引用 1 楼 sp1234 的回复:] 有可能需要换一个懂得“稍微深入一点”的人来开发。只要动手,甚至不用动脑,就能诊断问题。但是这需要亲自动手贴出证据。
我自己电脑环境,同事电脑环境我都测试过了,怎么测试都没有问题呀,客户那边我又去不了,要是有朋友也遇到过同样的问题,随手就知道问题了。你这样子回答真心看不懂啊。[/quote] 是说你们做测试的时候,根本没有真心测试过,比如插上U盘测试 随手测试一下好使,就认为不管客户那边什么情况都应该好使,这种思维是要不得的
  • 打赏
  • 举报
回复
其实你应该用的是硬盘序列号mo["SerialNumber"],这个一般是不会变的(但是也可以改),而不是Model属性 参考 http://blog.csdn.net/songkexin/article/details/4916602
  • 打赏
  • 举报
回复
CPU应该不会变的,可是磁盘Win32_DiskDrive这外东西,是否包含了软盘、光驱、U盘这些呢?有考虑这个没?
winnowc 2015-09-14
  • 打赏
  • 举报
回复
这样判断的话插上个U盘都会导致结果不同哦。你最好做个小工具,把客户那边的硬件数据收集下看看。
  • 打赏
  • 举报
回复
引用 3 楼 diaodiaop 的回复:
我虽然没有主动去运行你的代码.. 但是 定义一个变量 在循环里面+=这是什么鬼... 如果你的循环体有东西,那么你要的是一个"key" 而不是全部啊.. 如果你的循环体没有东西,那么也不需要循环了吧....
有可能还真是你说的这个问题,可能是用户是多块硬盘或cpu,然后每次取集合的顺序不一样,就会有不同的key了,而我和同事的的电脑都是单cpu单硬盘,所以怎么测试都不会有问题。
by_封爱 2015-09-14
  • 打赏
  • 举报
回复
我虽然没有主动去运行你的代码.. 但是 定义一个变量 在循环里面+=这是什么鬼... 如果你的循环体有东西,那么你要的是一个"key" 而不是全部啊.. 如果你的循环体没有东西,那么也不需要循环了吧....
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
有可能需要换一个懂得“稍微深入一点”的人来开发。只要动手,甚至不用动脑,就能诊断问题。但是这需要亲自动手贴出证据。
我自己电脑环境,同事电脑环境我都测试过了,怎么测试都没有问题呀,客户那边我又去不了,要是有朋友也遇到过同样的问题,随手就知道问题了。你这样子回答真心看不懂啊。
  • 打赏
  • 举报
回复
有可能需要换一个懂得“稍微深入一点”的人来开发。只要动手,甚至不用动脑,就能诊断问题。但是这需要亲自动手贴出证据。

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧