如何从 C++ 程序获取 Linux 上的主板 ID

Posted

技术标签:

【中文标题】如何从 C++ 程序获取 Linux 上的主板 ID【英文标题】:How to get motherboard ID on Linux from a C++ program 【发布时间】:2011-06-26 11:54:45 【问题描述】:

我想在没有 root 权限的情况下从 Linux (Ubuntu) 上的 C++ 程序检索主板 ID。我知道dmidecode可以做到这一点,但是它需要root权限,所以不适合我的需要。有谁知道非根替代品?源代码将不胜感激。

【问题讨论】:

为什么非 root 用户可以访问这些信息?出于什么目的?另外,在 VMWare 或 VirtualBox 中运行的虚拟机的主板 ID 是什么? 您可以从/sys/class/dmi/id/board_serial 获得有关最新内核的信息,您猜对了……应该只有root 才能读取。 @Juliano 这是出于许可目的,以避免未经授权使用主应用程序。这个许可应用程序应该悄悄地收集主板序列号并检查它是否与注册的序列号匹配。当然,Linux用户可能不是root 这种“许可”形式被严重破坏了。 *** 上有很多关于这个的问题,搜索它。例如,您可能发明的任何试图保护未经授权的副本的方法都只会以以下任一方式结束: 1. 破坏您的应用程序的 LD_PRELOAD 技巧;或 2. 您的应用程序分布在具有单一、恒定环境的虚拟机中。 @Alexey:您可能已经“致力于”做不可行的事情。重新考虑这一承诺可能是个好主意。如果您认为需要基于硬件签名的许可,您可以使用其他信息,例如网络适配器的 MAC 地址或其他信息。 【参考方案1】:

我认为你需要成为 root

打开 /proc/pci 会给你很多芯片组等信息,不确定 /proc/ 是否有特定的主板或 Bios 信息目录,看看 ls /proc 吗?

除此之外,您还可以查看从应用程序调用 dmidecode 命令行工具并捕获其输出。如果这还不够好,也许甚至可以查看 dmidecode 的源代码,看看它是如何工作的?

安德鲁

【讨论】:

信息在 /sys,而不是 /proc。此外,/proc/pci 已过时,并且不再存在于许多当前的 Linux 版本中。主板序列号的信息是敏感的,只有root才能访问。 Dmidecode 还需要 root 权限,他说他不想依赖。 @Andrew 我需要找到方法来获取它而不是 root,这是我无法使用 dmidecode 或其源或直接访问这些文件的主要原因。 @Juliano 自从我上次使用 linux 以来已经有一段时间了,哈哈 @Alexey @Juliano 我知道他要求的是非 root 方法,基本上我是说我不认为你可以。【参考方案2】:

您不必是 root 才能获取信息,但您需要先获得 root 权限才能获得权限。显然,root 可以保护对他们机器的访问,这包括对硬件身份信息的访问。

root 控制他们机器上的软件可以做什么,您的软件不限制 root 可以做什么。 (The #1 Law of Software Licensing 的 Linux 推论)

如果 root 选择安装您的硬件 id 收集器,则让非 root 用户可以使用该数据相对简单(但 root 修改您的 id 收集器以撒谎也相对容易)。

【讨论】:

好的,但是我可以在没有 root 权限的情况下检索有关 HDD (ATA) 序列、MAC 地址甚至 CPU ID 的信息。为什么主板序列号会如此特殊以至于没有解决方法? MAC 地址对于“正常”编程目的很有用,例如,当您需要知道另一台计算机应该用什么地址标记局域网唤醒“魔术包”时,或用于其他低级网络功能。至于 ATA 硬盘序列号,也许 Linux 也会决定将其限制为特权用户(我认为这实际上可能是个好主意)。 CPU ID 对于为特定处理器优化代码的程序很有用。主板序列号在普通代码中没有这种用处。 @Alexey:正如 John 所暗示的,CPUID 描述的是能力,它不是像主板序列号那样的唯一标识符。【参考方案3】:

lshw 应该为您获取序列号。它会告诉你它应该以超级用户身份运行,但无论如何都会运行。 (在 ubuntu 上测试)

【讨论】:

我之前试过了,但是好像只有以root启动lshw才会返回主板序列号 非常好的命令,但是返回的序列号 (BSN12345678901234567) 看起来有点不可能......(也 - 仅作为 root 用户运行,因为用户错过了序列号或说“UNCLAIMED”)。【参考方案4】:
$ lshal | grep 'system\.hardware\.serial'
  system.hardware.serial = '<serial-number>'  (string)

在 FC11 上以非 root 用户身份工作。

【讨论】:

什么是FC11,lshal不可用时怎么办?【参考方案5】:
sudo dmidecode --type baseboard

【讨论】:

以上是关于如何从 C++ 程序获取 Linux 上的主板 ID的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 c++ 程序传递到 linux 上的 python 程序 [关闭]

linux程序崩溃自动重启

C ++从Linux上的剪贴板获取字符串

如何从Linux上的c ++程序将特权级别提升为root

LINUX中,如何查看CPU,MEM,DISK,主板的相关信息?

如何找出 Linux 上的 GNU C++ 中剩余的可用内存量