【问题标题】:Is there really any way to uniquely identify any computer at all真的有什么方法可以唯一地识别任何计算机吗
【发布时间】:2012-03-17 22:38:18
【问题描述】:

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

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

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

那么,真的有任何方法可以唯一地识别任何计算机吗?现在我们只需要让我们的密钥生成器在 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");

并检索处理器ID

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

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

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

这是我们犯错的地方。因为getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") 返回了一些额外的 MAC 地址,这些地址确实在使用中。例如,当我们通过getmac 命令在命令提示符中搜索 MAC 地址时,它会为每台电脑显示一个或两个不同的 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 地址进行组合。我认为我们的目的将通过这种方式实现,如果在某些情况下不能实现,那么我们应该在少数情况下放弃它。

【问题讨论】:

  • 简单的答案是否定的。由于 PC 由许多可互换的部件组成。随着时间的推移,唯一可能保持不变的就是这种情况。因此,您需要指定的第一件事是您认为 PC 的哪些部分(就硬件而言)是“PC”。无论您选择什么,都将是某种妥协,因此您对先前答案的看法会模棱两可或不正确。
  • 如果您使用 CPUID 和 MAC 地址来识别机器并且三台机器返回相同的 ID,那么您的代码中存在错误。 MAC 地址是全球唯一的,在工厂分配。
  • MAC 地址可以更改/欺骗,因此将其作为单一身份验证方法是不明智的。这就是为什么我们决定使用 MAC 和 CPUID 的组合,这受到@Paul Alexander 和其他人在之前发布的类似问题中给出的建议的影响。即使在那之后获得相同的身份也是非常奇怪和奇怪的。我们使用另一个软件重新检查了问题,它还为三台计算机中的两台计算机返回了相同的 MAC 和处理器 ID,而我们还没有对第三台计算机进行测试。
  • 如果您要坚持使用主板序列号,请确保您的代码在检索序列号不起作用的情况下能够应对。例如,对于虚拟机来说这可能是不可能的,在某些情况下甚至在真实硬件上也可能是不可能的。 (我仍然认为这是一个糟糕的决定,因为如果有问题的主板死机,它会让用户完全陷入困境,这是糟糕的客户关系。)
  • 伪造的 MAC ID 仅在 LAN 中有效。如果在系统内部使用 getManagementInfo("Win32_NetworkAdapterConfiguration", "MacAddress") 之类的函数,它实际上是从硬件中检索原始 MAC ID,而不是伪造的 MAC ID。所以,不用担心 MAC 地址欺骗。

标签: c# windows uniqueidentifier


【解决方案1】:

如何添加主板序列号,例如:

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

【讨论】:

  • 有用的提示,谢谢。我会在接受之前等待更多答案。无论如何+1 :)
  • 这需要管理员权限吗?
  • 对于任何获得“基板序列号”的人,请参阅stackoverflow.com/q/1290533/184572
  • 用户需要 WMI 访问权限,可以通过执行具有管理员权限的命令来添加(检查codeproject.com/Articles/15848/WMI-Namespace-Security) 但是对于某些计算机,SMBIOS UUID 在重新启动后会发生变化,而对于其他计算机,它仅包含零或仅包含FF...因此,组合来自不同来源的多个 ID 一直是获得可靠系统的唯一方法...
【解决方案2】:

获得全球唯一 ID 的事实是,只有 MAC 地址是在您全面设置系统时不会更改的 ID。如果您要为特定产品生成密钥,最好的方法是为产品分配唯一 ID,并将产品 ID 与 MAC 地址结合起来。希望能帮助到你。

【讨论】:

  • 将产品 ID 与 MAC 地址结合起来似乎是一个非常好的主意。 +1
  • 请不要对名称更改感到恐慌。我刚刚合并了我的两个帐户。还是和以前一样的人。 :) 很抱歉这条评论给这篇文章带来不便。
  • 完全没有问题。顺便说一句,你能回答这个问题吗:stackoverflow.com/questions/9546228/…
  • MAC地址可由用户更改。
  • 另外,更换网卡肯定会更改 MAC 地址:这是唯一标识网卡而非计算机的好方法.
【解决方案3】:

我完全同意上面的评论。

对于软件许可,您可以使用:

计算机 MAC 地址(如果有多个 NIC 卡,则全部取走)+ 您的软件产品代码

大多数著名的电信供应商都在使用这种技术。

【讨论】:

    【解决方案4】:

    但是,关于相同的处理器 ID,我是绝对正确的 问题。当我们放置 wmic cpu 时,所有三个都返回相同的处理器 ID 在他们的命令提示符中获取 ProcessorId 命令。

    如果所有系统都作为虚拟机在同一管理程序上运行,则处理器 ID 将相同。

    MAC ID 看起来不错。唯一的问题是必须为用户提供重置应用程序的选项,以防 MAC 发生变化。

    【讨论】:

      【解决方案5】:

      看起来定制厨房就是这样。

      SMBIOS UUID(主板序列号)并不可靠,但在 99% 的情况下都能正常工作。但是有些品牌会为多台计算机设置相同的 UUID(可能是相同的生产批次)。获取它需要用户的 WMI 访问权限(如果他不是管理员),您可以通过启动询问管理员权限的外部进程来解决这个问题(检查 codeproject.com/Articles/15848/WMI-Namespace-Security)

      Windows 产品 ID 可能不错,但我读到它在某些情况下可能是相同的 (https://www.nextofwindows.com/the-best-way-to-uniquely-identify-a-windows-machine) 有人可以澄清一下相同的产品 ID(不是产品密钥)是否可能出现在多台计算机上?

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid 似乎很有趣。它是在安装 Windows 时生成的,如果发生更改,则需要重新激活 Windows。

      Mac 地址很有趣,但您只能取第一个,否则当接口被禁用或添加另一个网络接口并首先出现等时,您的唯一 ID 会发生变化。

      硬盘序列号很好,但是安装ghost时,它也可能会覆盖原始驱动器的序列号......而且HD序列很容易更改。

      最好的方法可能是生成一个包含这些机器标识符组合的 ID,并通过比较这些标识符来确定机器是否相同(即,如果至少一个 Mac 地址 + SMBIOS UUID 或产品 ID 正常,则接受)

      【讨论】:

        猜你喜欢
        • 2011-12-13
        • 2011-04-21
        • 1970-01-01
        • 2023-03-11
        • 2021-12-17
        • 1970-01-01
        • 2015-12-18
        • 2017-01-12
        • 2011-05-17
        相关资源
        最近更新 更多