首页 > 解决方案 > 显卡适配器的 PNPDeviceID 是否唯一?

问题描述

我需要获取视频卡适配器的唯一 ID。在设备的属性中搜索时(使用 Windows 的设备管理器),我注意到有一个Hardware Ids如下图所示的属性。

显卡适配器的硬件 ID

我试图在我的 winform 应用程序中获取这些 ID。我找到了这个方法:

string VideoCardInfoID()
{
  ManagementObjectSearcher objvide = new ManagementObjectSearcher("select * from Win32_VideoController");
  string output = string.Empty;
  foreach (ManagementObject obj in objvide.Get())
  {
    output += (obj["PNPDeviceID"] + "\n");             
  }
  return output;
}

这段代码的输出是:

PCI\VEN_10DE&DEV_1055&SUBSYS_908A104D&REV_A1\4&F7451F8&0&0008

我有两个问题:

  1. 显卡适配器的 PNPDeviceID 在所有机器上是否唯一?安装新的 Windows 后会发生变化吗?我知道堆栈溢出中有一些类似的问题,但它们不包含明确的答案,例如 this question和 this question

  2. c#为什么函数 ( )的输出中有附加字符\4&F7451F8&0&0008

更新:我尝试安装新的 Windows 并且硬件 ID 和 PNPDeviceID 仍然相同,但我仍然不知道 PNPDeviceID 在所有机器上是否唯一(我的意思是与 MAC 地址相同)。

标签: c#winformsuniqueidentifier

解决方案


显卡适配器的 PNPDeviceID 在所有机器上是否唯一?

不。基本上这个字符串是由什么组成的

<Bus>\<Device ID>\<Instance ID>

Instance ID仅在当前系统的上下文中是唯一的,甚至可能对整个系统都不是唯一的,仅对设备的总线是唯一的。

也就是说,如果您在计算机中安装了两个相同的视频卡,它们将具有相同的设备 ID,但不同的实例 ID。

显卡驱动程序可能会在实例 ID 中使用其自己的序列号。因此,实例 ID 可能是全局唯一的,但 WMI 无法为所有 PNP 设备做出该保证。

此时,如果可能的话,您可能必须使用每个供应商记录的方式来确定设备的序列号。


推荐阅读