获取USB串行号 c++

4
我想在Windows的C++中获取USB存储设备的序列号。我找到了许多针对Linux的C++示例,以及针对C#的示例,但没有针对Windows的C++示例。
编辑:
- 不幸的是,C++/CLI不是一个选项。 - 我正在寻找设备的序列号而不是文件系统的序列号。或者称作“设备实例路径”亦即“InstanceID”。

1
如果C++/CLI是一种选择,您可以使用与现有的C#示例相同的方法。或者,您可以发布一个.NET(C#)示例链接,有人可能知道一种将其转换为Win32(C)的方法。 - Greg Hewgill
这个问题展示了 .net 中的解决方案。https://dev59.com/qHRB5IYBdhLWcg3w-789 - danatel
1
@danatel:同一页上有一个Win32示例的链接。 - Greg Hewgill
@Greg Hewgill:这个例子是针对VB.net而不是C++的。 - Steven Smethurst
1
@Steven,它可能是使用VB编写的,但它使用了Win32 API或WMI API。这些API可以从C++中使用。只需使用msdn.com并搜索示例中使用的函数即可。 - jpyllman
显示剩余2条评论
3个回答

6
我有一篇关于如何在C++中获取USB卷的串行号码的文章,而不使用WMI。
这需要一些技巧,你需要将USB设备与磁盘卷相匹配。如果可能,应该避免使用WMI,因为它不稳定。
文章链接:http://oroboro.com/usb-serial-number/

3
如果需要用到C++,那么您将不得不编写COM代码。与VB.NET代码相比,这可能会有点令人不愉快,但在MSDN库中有非常好的示例,您只需要调整查询即可。
请注意,您链接的示例不会返回设备本身的序列号,而只是返回设备上的文件系统。这已经足够好了,因为USB设备没有序列号。
复制文件系统序列号是非常容易的,如果您正在考虑编写某种许可证执行方案,则应使用专为此目的设计的USB设备,即加密锁。这是无法破解的。厂商提供C++代码来验证许可证。

是的,这正是我要用这个序列号的目的。一个许可证系统。你会如何改变“文件系统序列号”? - Steven Smethurst
你是在谈论GetVolumeInformation()吗?我知道每次驱动器格式化时,这个信息位会发生变化。可以使用以下工具实现动态更改:http://www.codeproject.com/kb/system/change_drive_sn.aspx但我没有听说过任何可以更改设备的“Device Instance Path”或“InstanceID”的东西。 - Steven Smethurst
4
大多数USB设备都拥有序列号。如果您想获取实际的设备序列号,您需要将USB设备与磁盘卷匹配。请参见下面的我的答案和一篇关于如何执行此操作的文章链接。 - Rafael Baptista

1

序列号是位于HKLM\SYSTEM\CCS\Enum\USB\Vid_xxxx&Pid_yyyy下的子键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接