我正在创建特定于机器的许可证。许可证基于以下项目:
我假设如果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;
}
答案 0 :(得分:12)
不是一个真正的答案,而是一个谨慎的话。我曾在一家软件公司工作过,它做过类似的许可机制,而且很脆弱。 特别是在笔记本电脑上。考虑:
在笔记本电脑上切换有线和无线时,每个界面上都有不同的MAC地址。
更改MAC地址可能会有好处。例如,各州的一些有线互联网提供商愚蠢地将您的MAC地址绑定到您的帐户,并且可能需要将他们的计算机直接连接到电缆调制解调器,然后如果他们的路由器死了则克隆其路由器的MAC。
如果用户要从其他硬盘驱动器(例如闪存驱动器或USB记忆棒)启动,这会改变报告的第一个驱动器吗?
这早在商品虚拟化时代就已存在。现在考虑您可以切换设置并重新启动VM,并具有:不同数量的RAM,不同大小的硬盘驱动器,不同类型的虚拟硬盘驱动器控制器类型(IDE,SCSI,可能还有多个SCSI控制器接口)。您可以热插拔CD / DVD设备并通过鼠标单击更改NIC设置。
所以我并不是说“不要这样做”,但我会鼓励你在尽可能多的环境中尽可能多的机器上测试这种机制,我会进一步表明当用户无法运行他们付费的软件时,您的用户将获得宝贵的耐心。
您是否考虑过硬件加密狗?
答案 1 :(得分:9)
我发现现在MAC地址真的不值得检查。每台计算机都有多个网络适配器,其中任何一个都可能是在任何给定时间可能存在或不存在的外部设备。我们推出了一个多年前过分关注MAC地址的系统,最终成为客户服务灾难。
另一方面,更换CPU,主板,总线/磁盘控制器或主硬盘驱动器的情况相对较少。
答案 2 :(得分:8)
这是一篇关于MS如何在Windows XP中做到这一点的相当不错的文章。也许不完全是你想要的,但这是一个很好的起点。
Windows XP Activation Explained
Windows会检查哪些硬件?
系统检查这十类硬件: