c# - 显卡适配器的 PNPDeviceID 是否唯一?
问题描述
我需要获取视频卡适配器的唯一 ID。在设备的属性中搜索时(使用 Windows 的设备管理器),我注意到有一个Hardware Ids
如下图所示的属性。
我试图在我的 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
我有两个问题:
显卡适配器的 PNPDeviceID 在所有机器上是否唯一?安装新的 Windows 后会发生变化吗?我知道堆栈溢出中有一些类似的问题,但它们不包含明确的答案,例如 this question和 this question。
c#
为什么函数 ( )的输出中有附加字符\4&F7451F8&0&0008
?
更新:我尝试安装新的 Windows 并且硬件 ID 和 PNPDeviceID 仍然相同,但我仍然不知道 PNPDeviceID 在所有机器上是否唯一(我的意思是与 MAC 地址相同)。
解决方案
显卡适配器的 PNPDeviceID 在所有机器上是否唯一?
不。基本上这个字符串是由什么组成的
<Bus>\<Device ID>\<Instance ID>
Instance ID仅在当前系统的上下文中是唯一的,甚至可能对整个系统都不是唯一的,仅对设备的总线是唯一的。
也就是说,如果您在计算机中安装了两个相同的视频卡,它们将具有相同的设备 ID,但不同的实例 ID。
显卡驱动程序可能会在实例 ID 中使用其自己的序列号。因此,实例 ID 可能是全局唯一的,但 WMI 无法为所有 PNP 设备做出该保证。
此时,如果可能的话,您可能必须使用每个供应商记录的方式来确定设备的序列号。
推荐阅读
- linux - 基于 Linux 的导航软件在使用脚本后无法正常工作 (Audi MMI 3g HIGH)
- php - 如何修复laravel中的未知列'CONCAT'
- sql - 屏蔽/散列数据
- azure-data-factory - 执行多个复制活动并将数据推送到多个表中的替代方法
- r - 图例中二维密度图从0变为1
- android - Android 如何将 UDP 接收音频转换为 wav 文件
- excel - 找到一个范围,然后在另一个公式中实现它
- java - java数据库连接与OOP
- kotlin - 如何在 Kotlin 中向 StringBuilder 追加新行
- android - 如何使用异步任务来控制视图寻呼机