gpt4 book ai didi

c# - 真的有什么方法可以唯一地识别任何一台计算机吗?

转载 作者:IT王子 更新时间:2023-10-29 04:13:10 24 4
gpt4 key购买 nike

我知道在 stackoverflow 中有很多类似的问题,例如:

...还有几十个,我都研究过了。

问题是一些已接受的答案建议将 MAC 地址作为唯一标识符,这是完全不正确的。其他一些答案建议使用看起来更合乎逻辑的各种组件的组合。但是,在使用组合的情况下,应该考虑哪个组件自然不太可能经常更改。几天前,我们为软件许可问题开发了一个 key 生成器,我们使用 CPUID 和 MAC 的组合来唯一标识一台 Windows PC,直到实际测试为止,我们认为我们的方法足够好。具有讽刺意味的是,当我们对其进行测试时,我们发现三台计算机使用我们的 key 生成器返回相同的 ID!

那么,真的有任何方法可以唯一地标识任何一台计算机吗?现在我们只需要让我们的 key 生成器在 Windows PC 上工作。由于我们的系统是在 .net 上开发的,因此以某种方式(如果可能的话)使用 c# 会很棒。

更新:

很抱歉造成了一些困惑和明显的误报。我们发现我们检索硬件信息的方法有些不正确。最初我想删除这个问题,因为现在我自己的困惑已经消失,我相信两个或多个组件的组合足以识别一台计算机。然而,后来我决定保留它,因为我认为我应该澄清是什么导致了这个问题,因为同样的事情将来可能会伤害其他人。

这就是我们所做的(不包括其他代码):

我们使用 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;
}

然后在需要的地方我们使用该函数来检索 MAC 地址

string strMAC = getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress");

并检索 ProcessorID

string strProcessorId = getManagementInfo("Win32_Processor", "ProcessorId");

此时,strMAC 将包含多个 MAC 地址(如果有多个)。为了只取一个,我们只取了前 17 个字符(12 个 MAC 数字和中间的 5 个冒号)。

strMAC = strMAC.Length > 17 ? strMAC.Remove(17) : strMAC;

这就是我们犯的错误。因为 getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") 返回了许多实际使用的额外 MAC 地址。例如,当我们通过 getmac 命令在命令提示符中搜索 MAC 地址时,它会为每台 pc 显示一个或两个 MAC 地址,这些地址都是不同的。但是 getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") 返回了四到五个 MAC 地址,其中一些对于所有计算机都是相同的。由于我们只是获取了函数返回的第一个 MAC 地址,而不是检查其他任何内容,因此在 strMAC 中偶然获取了相同的 MAC 地址。

以下代码由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;
}

但是,对于相同的处理器 ID 问题,我是完全正确的。当我们在它们的命令提示符中输入 wmic cpu get ProcessorId 命令时,这三个都返回相同的处理器 ID。

现在我们决定使用主板序列号而不是处理器 ID 来与 MAC 地址组合。我认为我们的目的将通过这种方式实现,如果在某些情况下不能实现,那么我们应该在少数情况下放弃它。

最佳答案

如何添加主板序列号以及例如:

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();
}

关于c# - 真的有什么方法可以唯一地识别任何一台计算机吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com