C#基于硬件ID创建一个唯一的ID
本文关键字:ID 一个 唯一 创建 硬件 于硬件 | 更新日期: 2023-09-27 18:21:34
我正在创建一个特定于机器的许可证。许可证基于以下项目:
- MAC地址
- CPU序列号
- 驱动器0的计算机卷序列号
我假设,如果3中的2个匹配,那么我的许可证是有效的。因此,可以获得新的网卡,并且许可证仍然有效,等等。
这是一个好方法吗?还是我会遇到不匹配或不定期更改的问题?
我正在尝试获取计算机的唯一标识符,以便验证许可证。
请告诉我这看起来怎么样,或者你是否有更好的解决方案!
再次感谢!
**这是我想出的**
我最终只使用了VolumeSerial、CpuId和VideoControllerDescription。
public enum HardwareProfileComponents
{
ComputerModel,
VolumeSerial,
CpuId,
MemoryCapacity,
VideoControllerDescription
}
public static Dictionary<string, string> HardwareProfile()
{
var retval = new Dictionary<string, string>
{
{HardwareProfileComponents.ComputerModel.ToString(), GetComputerModel()},
{HardwareProfileComponents.VolumeSerial.ToString(), GetVolumeSerial()},
{HardwareProfileComponents.CpuId.ToString(), GetCpuId()},
{HardwareProfileComponents.MemoryCapacity.ToString(), GetMemoryAmount()},
{HardwareProfileComponents.VideoControllerDescription.ToString(), GetVideoControllerDescription()}
};
return retval;
}
private static string GetVideoControllerDescription()
{
Console.WriteLine("GetVideoControllerDescription");
var s1 = new ManagementObjectSearcher("select * from Win32_VideoController");
foreach (ManagementObject oReturn in s1.Get())
{
var desc = oReturn["AdapterRam"];
if ( desc == null) continue;
return oReturn["Description"].ToString().Trim();
}
return string.Empty;
}
private static string GetComputerModel()
{
Console.WriteLine("GetComputerModel");
var s1 = new ManagementObjectSearcher("select * from Win32_ComputerSystem");
foreach (ManagementObject oReturn in s1.Get())
{
return oReturn["Model"].ToString().Trim();
}
return string.Empty;
}
private static string GetMemoryAmount()
{
Console.WriteLine("GetMemoryAmount");
var s1 = new ManagementObjectSearcher("select * from Win32_PhysicalMemory");
foreach (ManagementObject oReturn in s1.Get())
{
return oReturn["Capacity"].ToString().Trim();
}
return string.Empty;
}
private static string GetVolumeSerial()
{
Console.WriteLine("GetVolumeSerial");
var disk = new ManagementObject(@"win32_logicaldisk.deviceid=""c:""");
disk.Get();
string volumeSerial = disk["VolumeSerialNumber"].ToString();
disk.Dispose();
return volumeSerial;
}
private static string GetCpuId()
{
Console.WriteLine("GetCpuId");
var managClass = new ManagementClass("win32_processor");
var managCollec = managClass.GetInstances();
foreach (ManagementObject managObj in managCollec)
{
//Get only the first CPU's ID
return managObj.Properties["processorID"].Value.ToString();
}
return string.Empty;
}
这不是一个真正的答案,而是一个警告。我在一家软件公司工作,该公司也有类似的许可机制,它。。。脆性尤其是在笔记本电脑上。考虑:
-
在笔记本电脑上切换有线和无线时,每个接口上都会有不同的MAC地址。
-
更改MAC地址可能有好处。例如,美国的一些有线互联网提供商愚蠢地将你的MAC地址与你的帐户绑定,如果他们的路由器坏了,他们可能需要将计算机直接插入有线调制解调器,然后克隆路由器的MAC。
-
如果用户从不同的硬盘(例如,闪存驱动器或U盘)启动,这会改变报告的第一个驱动器吗?
这早在商品虚拟化时代之前。现在考虑一下,您可以切换设置并重新启动VM,并拥有:不同数量的RAM、不同大小的硬盘驱动器、不同类型的虚拟硬盘驱动器控制器类型(IDE、SCSI,也许还有多个SCSI控制器接口)。您可以热插拔CD/DVD设备,只需单击鼠标即可更改NIC设置。
因此,我并不是说"不要这样做",确切地说,但我鼓励您在尽可能多的环境中的尽可能多机器上测试这种机制,我还建议当您的用户无法运行他们付费购买的软件时,他们将几乎没有耐心
你考虑过硬件加密狗吗?
我发现MAC地址现在真的不值得检查了。每台计算机都有一个以上的网络适配器,其中任何一个都可能是在任何给定时间存在或不存在的外部设备。几年前,我们推出了一个过于关注MAC地址的系统,但它最终成为了一场客户服务灾难。
另一方面,更换CPU、主板、总线/磁盘控制器或主硬盘驱动器的情况相对较少。
这是一篇关于MS如何在Windows XP中做到这一点的相当不错的文章。也许不是你想要的,但这是一个很好的起点。
Windows XP激活解释
Windows检查什么硬件?
系统检查以下十类硬件:
- 显示器适配器
- SCSI适配器
- IDE适配器(实际上是主板)
- 网络适配器(NIC)及其MAC地址
- RAM数量范围(即0-64mb、64-128mb等)
- 处理器类型
- 处理器序列号
- 硬盘驱动器设备
- 硬盘驱动器卷序列号(VSN)
- 光盘/光盘/DVD光盘