Saj*_*ood 30 c# windows uniqueidentifier
我知道stackoverflow中有很多类似的问题,如下所示:
......还有几十个,我研究过它们.
问题是一些已接受的答案已将MAC地址建议为唯一标识符,这完全不正确.其他一些答案建议使用各种组件的组合,这似乎更合乎逻辑.但是,在使用组合的情况下,应该考虑哪些组件自然不可能经常更换.几天前,我们为软件许可问题开发了一个密钥生成器,我们使用CPUID和MAC的组合来唯一地识别一台Windows PC,直到实际测试我们认为我们的方法已经足够好了.具有讽刺意味的是,当我们进行测试时,我们发现有三台计算机使用我们的密钥生
那么,真的有任何方法可以唯一地识别任何计算机吗?现在我们只需要让我们的密钥生成器在windows pc上运行.使用c#的某种方式(如果可能的话)会很好,因为我们的系统是在.net上开发的.
更新:
很抱歉造成一些混乱和明显错误的警报.我们在检索HW信息的方法中发现了一些不正确之处.主要是我想删除这个问题,因为现在我自己的困惑已经消失,我确实认为两个或更多组件的组合足以识别计算机.然而,然后我决定保留它,因为我认为我应该澄清导致问题的原因,因为同样的事情可能会伤害其他人.
这就是我们正在做的事情(不包括其他代码):
我们使用getManagementInfo函数来检索MAC和处理器ID
private String getManagementInfo(String StrKey_String, String strIndex)
{
String strHwInfo = null;
try
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + StrKey_String);
foreach (ManagementObject share in searcher.Get())
{
strHwInfo += share[strIndex];
}
}
catch (Exception ex)
{
// show some error message
}
return strHwInfo;
}
Run Code Online (Sandbox Code Playgroud)
然后在需要的地方我们使用该函数来检索MAC地址
string strMAC = getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress");
Run Code Online (Sandbox Code Playgroud)
并检索ProcessorID
string strProcessorId = getManagementInfo("Win32_Processor", "ProcessorId");
Run Code Online (Sandbox Code Playgroud)
此时,strMAC如果有多个MAC地址,则将包含多个MAC地址.只取一个,我们只取了前17个字符(12个MAC数字和5个冒号).
strMAC = strMAC.Length > 17 ? strMAC.Remove(17) : strMAC;
Run Code Online (Sandbox Code Playgroud)
这是我们犯错误的地方.因为getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress")返回了一些真正使用的额外MAC地址.例如,当我们通过getmac命令在命令提示符中搜索MAC地址时,它显示每个pc的一个或两个MAC地址都是不同的.但是getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress")返回了四到五个MAC地址,其中一些对于所有计算机都是相同的.因为我们刚刚获取了我们的函数返回的第一个MAC地址而不是检查其他任何内容,所以相同的MAC地址是strMAC不可避免的.
Sowkot Osman的以下代码通过仅返回第一个活动/启用的MAC地址来实现这一目的:
private static string macId()
{
return identifier("Win32_NetworkAdapterConfiguration", "MACAddress", "IPEnabled");
}
private static string identifier(string wmiClass, string wmiProperty, string wmiMustBeTrue)
{
string result = "";
System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass);
System.Management.ManagementObjectCollection moc = mc.GetInstances();
foreach (System.Management.ManagementObject mo in moc)
{
if (mo[wmiMustBeTrue].ToString() == "True")
{
//Only get the first one
if (result == "")
{
try
{
result = mo[wmiProperty].ToString();
break;
}
catch
{
}
}
}
}
return result;
}
//Return a hardware identifier
private static string identifier(string wmiClass, string wmiProperty)
{
string result = "";
System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass);
System.Management.ManagementObjectCollection moc = mc.GetInstances();
foreach (System.Management.ManagementObject mo in moc)
{
//Only get the first one
if (result == "")
{
try
{
result = mo[wmiProperty].ToString();
break;
}
catch
{
}
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是,我对完全相同的处理器ID问题完全正确.当我们将wmic cpu get ProcessorId命令放入命令提示符时,所有三个都返回相同的处理器ID .
现在我们决定使用主板序列号而不是处理器ID来组合MAC地址.我认为我们的目的将以这种方式提供,如果在某些情况下不这样做,那么我们应该在这几种情况下放手.
Chr*_*sBD 11
如何添加主板序列号,例如:
using System.management;
//Code for retrieving motherboard's serial number
ManagementObjectSearcher MOS = new ManagementObjectSearcher("Select * From Win32_BaseBoard");
foreach (ManagementObject getserial in MOS.Get())
{
textBox1.Text = getserial["SerialNumber"].ToString();
}
//Code for retrieving Processor's Identity
MOS = new ManagementObjectSearcher("Select * From Win32_processor");
foreach (ManagementObject getPID in MOS.Get())
{
textBox2.Text = getPID["ProcessorID"].ToString();
}
//Code for retrieving Network Adapter Configuration
MOS = new ManagementObjectSearcher("Select * From Win32_NetworkAdapterConfiguration");
foreach (ManagementObject mac in MOS.Get())
{
textBox3.Text = mac["MACAddress"].ToString();
}
Run Code Online (Sandbox Code Playgroud)
获取全局唯一ID的事实是,只有MAC地址是在您全部设置系统时不会更改的ID.如果要为特定产品生成密钥,最好的方法是为产品分配唯一ID并将产品ID与MAC地址组合.希望能帮助到你.
| 归档时间: |
|
| 查看次数: |
15409 次 |
| 最近记录: |