如何使用 PowerShell 和其他工具查找 USB 硬件 ID

最后更新: 17/12/2025
作者: 艾萨克
  • El 硬件 ID 唯一标识每个设备, Windows 他用它来 驱动程序许可证和安全。
  • PowerShell的 方便您轻松列出和筛选 USB 使用 Get-PnpDevice 等 cmdlet 和 WMI 类进行 ID 识别。
  • 可以通过脚本自动跟踪 USB 设备,这些脚本通过 REST API 将数据发送到中央服务器。
  • 像这样的工具 设备管理器 USBView 可以方便地读取 USB 描述符的 VID/PID 和其他关键字段。

使用 PowerShell 查找 USB 硬件 ID

如果你曾经插入过U盘,之后电脑开始出现异常行为,或者Windows显示了神秘的错误信息,那么问题很可能与此有关。 USB设备硬件标识符(硬件ID)了解如何使用 PowerShell 和其他 Windows 内置工具查找该 ID 是一项可以为您省去很多麻烦的技能,尤其是在不允许安装第三方软件的商业环境中。

此外,在许多公司,这是强制性的。 控制哪些USB设备已连接,注册其ID,并实现可追溯性 出于安全和监管合规方面的考虑。从防止信息泄露到阻止访问 恶意软件 处理受感染的U盘时,关键在于正确识别每个设备。本文将详细介绍硬件ID(HWID)的工作原理,如何使用PowerShell和其他工具获取U盘ID,以及如何利用这些信息来诊断问题和自动跟踪设备。

什么是硬件 ID (HWID)?为什么你应该关心它?

El 硬件 ID 或 HWID 是与每个物理组件关联的唯一数字标识符。 电脑的组成部分:主板、硬盘、显卡、网卡、USB 控制器等等。它通常被称为设备的“指纹”,因为它能将一台电脑与其他电脑区分开来,即使两台电脑看起来完全相同。

在典型的个人电脑上,操作系统结合了 构建全局机器身份需要几个主要组件的硬件 ID (HWID)。这种身份对于诸如以下事情至关重要: 与特定计算机绑定的软件许可证跟踪 IT 资产和许多安全流程需要确保程序只能在授权的硬件上运行。

Windows 发明这个标识符并非毫无缘由: 每个硬件都有其唯一的ID,并记录在固件中。 (例如,存储在设备的 EEPROM 中)。操作系统读取 EEPROM 中的信息,并据此生成标识符字符串,这些字符串随后会出现在设备管理器、PowerShell 或其他位置。 comandosWMIC.

首次安装操作系统时, Windows 会对该硬件配置进行快照。 并生成一组与该机器关联的标识符。如果您之后更改了某些重要部件,例如主板,则这组硬件 ID 可能会发生足够大的变化,从而再次触发许可证验证,甚至在某些产品中需要重新激活系统。

如何构建 USB 设备标识符

对于 USB 设备,HWID 源自一个非常具体的描述符: USB 设备描述符 (USB_DEVICE_DESCRIPTOR)它是每个 USB 设备都必须提供的数据结构,用于描述其基本特征:类别、支持的 USB 版本、制造商、产品等。

该描述符中包含两个关键字段: idVendor 和 idProduct第一个标识符标识制造商(供应商 ID 或 VID),第二个标识符标识具体的产品型号(产品 ID 或 PID)。Windows 使用这些值来构建类似这样的字符串。 USB\VID_XXXX&PID_YYYY… 然后您会在设备管理器中看到它们,显示为“硬件 ID”。

例如,微软的 USB 网络摄像头可能具有类似这样的功能: idVendor = 0x045E (微软)和 idProduct = 0x0728这两个值,以及设备版本号(bcdDevice以及其他领域,结合起来形成 硬件 ID 和兼容 ID Windows 会匹配正确的驱动程序。

USB接口 该描述符指示设备符合的 USB 规范版本(例如,0x0200 表示 USB 2.0)。这有助于 USB 驱动程序堆栈了解如何与设备通信、设备支持的速度以及可用的配置选项。

一个重要的细节是 USB 设备在连接期间不应更改其描述符信息。即使改变电源状态也不会改变。可能会出现的情况是,根据连接速度(高速或全速)的不同,它会显示不同的信息,但这在连接时就已经决定了。

从控制器端来看,主机通过以下方式获取此描述符: GET_DESCRIPTOR 控制传输指向设备在 Windows 中,内核模式驱动程序(KMDF/UMDF/WDM)可以通过 URB(USB 请求块)或框架 API 正式请求该描述符,但这已经是驱动程序开发领域,而不是通过 PowerShell 进行管理的领域。

使用 Windows 图形工具查看 USB 硬件 ID

在 Windows 中查看 USB 硬件 ID

在深入学习 PowerShell 之前,值得记住的是: Windows 提供了几种非常直观的图形化方法来查看任何设备的硬件 ID (HWID)。当您只需要识别特定设备时,它们尤其有用。

  纠正:错误代码 0xa00f4244 导致相机停止工作

1.设备管理器

最快的方法,无需编写任何一行代码,就是使用…… 视窗设备管理器它兼容任何类型的硬件,包括 USB 设备。 存储打印机、网络摄像头等。

  • 打开设备管理器 按下 Win + X 并选择“设备管理器”,或者搜索“devmgmt.msc”。
  • 找到该组件,例如在…… “通用串行总线控制器”或“磁盘驱动器” 如果是U盘的话。
  • 右键单击出现问题的设备并输入 物业.
  • 转到标签 详细信息.
  • 在“属性”下拉菜单中,选择 硬件 ID.

你会看到一个字符串列表;最具体的字符串通常包含 VID、PID,有时还包含序列号或 SUBSYS。这些字符串随后可以在以下位置使用: 脚本或驱动程序搜索原封不动地复制它们。

2. 使用 WMIC 的命令提示符

如果您更喜欢控制台选项,但暂时不想接触 PowerShell,可以使用以下方法。 WMIC (虽然在现代版本中已弃用,但您仍然可以在许多计算机上找到它):

wmic path win32_pnpentity 获取名称、设备 ID

此命令显示 所有即插即用设备及其设备ID这些正是我们感兴趣的硬件 ID。您可以直观地筛选它们,或者将输出导出到文件进行处理。

3. 第三方应用程序(如允许)

在允许的环境下,通常会使用以下工具: CPU-Z、Speccy 或 HWiNFO 为了获得完整的系统X射线图像,包括许多组件的硬件识别码(HWID)。然而,在许多公司,这种做法是被禁止的。 PowerShell 已成为安全策略认可的瑞士军刀.

使用 PowerShell 获取 USB 硬件 ID

PowerShell 包含功能强大的 cmdlet,可用于查看和筛选即插即用设备的信息。对于硬件 ID 而言,最有趣的是…… Get-PnpDevice尽管一些旧版脚本中仍然使用较旧的 WMI 类。

使用 Get-PnpDevice 列出硬件 ID

要查看系统中所有活动设备的标识符,您可以使用:

Get-PnpDevice -PresentOnly | Select-Object -Property Name,InstanceId

此命令返回 包含设备友好名称及其实例 ID 的表格该 InstanceId 正是硬件 ID 字符串(或非常接近该字符串),您可以将其与错误、系统事件或驱动程序搜索关联起来。

如果你只想专注于 PCI设备例如,您可以使用以下条件进行筛选:

Get-PnpDevice | Where-Object { $_.InstanceId -match '^PCI' } | Select-Object FriendlyName, InstanceId

对于 USB 设备,您可以使用类似的过滤器来筛选 InstanceId 字符串,只需更改前缀即可:

Get-PnpDevice | Where-Object { $_.InstanceId -like 'USB\VID_*' } | Select-Object FriendlyName, InstanceId

真实案例:通过 ID 识别有问题的 U 盘

一个非常常见的场景如下: 您的电脑死机了,您查看事件查看器,发现有类似“USB\VID_1F75&PID_0917\8&31abfd78&0&3”的设备引用你在设备管理器中查找该 ID,但根本无法知道它到底是什么。

实际例子: 在这种情况下,使用 PowerShell 进行交叉引用信息非常有用。例如,您可以尝试查找 InstanceId 以该模式开头的任何即插即用设备:

Get-PnpDevice -InstanceId 'USB\VID_1F75*'

如果此方法没有返回任何结果(有时设备断开连接时会发生这种情况),您可以使用 WMI 检查 USB 设备历史记录,或者在获得许可的情况下,使用诸如以下工具: USBDeview 它会显示所有曾经连接过的设备,包括连接日期和端口。

查看房产信息: 如果取得成效,您可以尝试以下方法扩大成效:

Get-PnpDevice -InstanceId 'USB\VID_1F75*' | Get-PnpDeviceProperty

这应该列出 与该器件相关的所有PnP特性但是,如果设备不存在或存在权限问题,您可能会收到空结果或部分结果。要将信息导出到 CSV 文件,可以这样做:

Get-PnpDevice -InstanceId 'USB\VID_1F75*' | Get-PnpDeviceProperty | Export-Csv -Path 'DevDetails.csv' -NoTypeInformation

如果 CSV 文件为空,几乎总是意味着 当时没有设备符合过滤器要求 或者 cmdlet 无法读取属性(由于权限问题或设备无响应)。

查看通过 WMI 连接的 USB 存储设备

另一个典型例子是想知道 当前连接了哪些U盘或闪存盘?PowerShell 中的一个经典快捷方法是依赖 WMI 类。 Win32_磁盘驱动器 按接口类型筛选:

Get-WmiObject Win32_DiskDrive | Where-Object { $_.InterfaceType -eq 'USB' }

如果您想要更易读、更易于导出的内容,可以使用 PSCustomObject 仅投影相关字段:

Get-WmiObject Win32_DiskDrive | Where-Object { $_.InterfaceType -eq 'USB' } | ForEach-Object {
[PSCustomObject]@{
设备ID = $_.设备ID
模型 = $_.模型
Serial = (Get-WmiObject Win32_PhysicalMedia | Where-Object { $_.Tag -eq $_.DeviceID }).SerialNumber
}
}

这里,每个自定义对象都会显示 设备标识符、型号和物理序列号 (前提是制造商正确显示)。这为库存和跟踪脚本提供了非常有用的基础。

使用 PowerShell 自动监控和记录 USB 设备

在企业环境中,IT部门想要……是很常见的。 集中式注册所有已连接 USB 设备 对于每台机器:它是什么设备、何时连接、从哪台计算机连接等等。这有助于检测未经授权的设备、调查安全事件并遵守内部政策。

  宏碁确认其在美国的硬件价格上涨 10%

一种无需额外许可证即可灵活实现此目的的方法是挂载 un 脚本 一个 PowerShell 脚本,用于从每个 USB 设备收集相关信息,并通过 REST API 将其发送到中央服务器。基于前面提到的 WMI 示例,该方案大致如下所示:

Get-WmiObject Win32_DiskDrive | Where-Object { $_.InterfaceType -eq “USB” } | ForEach-Object {
[PSCustomObject]@{
设备ID = $_.设备ID
模型 = $_.模型
Serial = (Get-WmiObject Win32_PhysicalMedia | Where-Object { $_.Tag -eq $_.DeviceID }).SerialNumber
}
} | ConvertTo-Json | Invoke-RestMethod -Uri «http://servidorcentral/api/usblog» -Method Post

这块 它收集所有具有 USB 接口的磁盘,准备带有键数据的对象,并将它们序列化为 JSON。然后,随着 调用-RestMethod将该 JSON 数据发送到日志服务器上的 HTTP 端点。接下来,您可以根据自己的想象力(以及安全需求)进行扩展:您可以添加团队名称、会话用户、确切的日期和时间等等。

为了进行持续监控,该脚本通常会与以下组件结合使用: Windows 任务计划程序 可以在系统启动或登录时运行,或者您可以创建一个服务来监视与 USB 连接相关的系统事件并触发实时传输。

创建一个简单的 REST API 来记录 USB 数据

要接收 PowerShell 脚本发送的数据,您需要一个小的 Web 服务器已准备好路由,可以接受 JSON 格式的 POST 请求。一种非常快捷的方法是使用 Python 使用 Flask这样,您只需几行代码即可设置一个端点。

基本思路是这样的:

从 flask 导入 Flask、请求、jsonify
app = Flask(__ name__)
@app.route('/api/usblog', methods=['POST'])
def log_usb_data():
data = request.get_json()
如果没有数据:
返回 jsonify({"error": "未发送数据"}), 400
with open("usb_log.txt", "a") as log_file:
log_file.write(f"{data}\n")
返回 jsonify({"message": "数据接收成功"}), 200
如果 __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

这样,来自 PowerShell 脚本的每次调用都将结束。 在 usb_log.txt 文件中添加包含 USB 设备数据的行显然,在实际部署中,您需要将数据发送到数据库,添加身份验证,使用 HTTPS 加密流量等等,但作为起点,这已经绰绰有余了。

要求: 启动并运行它的基本步骤如下:

  • 使用以下方式安装 Flask 点安装烧瓶 在你的Python服务器上。
  • 把代码保存到一个地方 服务器.py 并用 python server.py.
  • 在 PowerShell 脚本中配置 URL 以指向 http://IP_DEL_SERVIDOR:5000/api/usblog.

从那时起,任何有权连接该服务器的设备都将能够 请提交您的USB设备清单 定期或按需。

安排 USB 脚本在 Windows 启动时运行

为了使整个系统切实可行,重要的是: PowerShell 脚本将自动启动,无需任何人手动运行。Windows 提供了两种常用的方法:任务计划程序和启动文件夹。

使用任务计划程序

快速设置: 使用任务计划程序(“任务计划程序”您可以配置执行方式以响应不同的系统事件:

  • 打开任务计划程序并选择 “创建任务”.
  • 在“常规”选项卡上,输入一个名称,例如 “USB追踪” 并选择“以最高权限运行”。
  • 在《触发器》中,他添加了一个 “系统启动时”或“我登录时”这取决于你的兴趣。
  • 在“操作”中,选择“启动程序”并指向 powershell.exe 带类型参数 -NoProfile -ExecutionPolicy Bypass -File «C:\path\script.ps1».
  • 保存并确认任务已启用。

这确保了 每次设备启动时,监控都会开始。 只要拥有相应的权限,脚本就可以访问所有必要的信息。

使用带有 .bat 文件的主文件夹

另一个更简单但粒度较差的选择是创建一个 。BAT 调用 PowerShell 并将其放置在用户的主文件夹中:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File «C:\path\del\script.ps1»

例如,你可以将其保存为: tracking_usb.bat并将其复制到:

%APPDATA%\Microsoft\Windows\开始菜单\程序\启动

用户登录后, Windows 将运行该 .bat 文件,并同时运行其中的 PowerShell 脚本。对于小型环境或不想使用任务调度程序的情况,这是一个很有用的解决方案。

使用 PowerShell 跟踪远程计算机上的 USB 设备

在许多企业网络中,问题不仅在于知道哪个 USB 驱动器连接到自己的计算机,而且 获得跨多台计算机的连接设备的全局视图当无法使用第三方代理时,PowerShell Remoting 和 WMI 的组合仍然是一种非常有效的方法。

一个用于列出多台计算机上的 USB 设备的典型脚本示例如下所示:

$computer = «COMPUTER1″,»COMPUTER2″,»COMPUTER3»
$namespace = "root\CIMV2"
Get-WmiObject -Class Win32_USBControllerDevice -ComputerName $computer -Namespace $namespace |
ForEach-Object { [wmi]($_.Dependent) } |
按制造商、描述、设备 ID 排序 |
Format-Table -GroupBy Manufacturer Description,Service,DeviceID |
Out-File -Append -FilePath C:\USB\usblist.txt

  Windows 中的错误代码 0x80072F8F:原因、解决方案和完整指南

其理念是: 查询每台远程计算机上的 USB 控制器-设备关系,将 Dependent 属性解析为实际的 WMI 实例,然后将排序后的信息转储到文本文件中。如果文件仍然为空,则需要检查权限、远程访问、防火墙,当然还有脚本语法(空格或未正确闭合的引号是常见错误)。

只要这种脚本结构良好,你就能实现 每个团队的USB设备汇总清单按制造商和描述分组,无需依赖第三方软件。

使用 USB ID 查找和维护驱动程序

除了安全方面之外,了解和管理 硬件 ID 是找到合适驱动程序的关键。尤其是在 Windows 找不到通用版本或系统更新后设备“死机”的情况下。

层级模式: 这种类型的 ID 通常遵循分层模式,尤其是在 PCI/PCIe 设备中:

  • VEN_XXXX 确定芯片制造商。
  • DEV_XXXX 请注明设备的具体型号。
  • 子系统_XXXXXXXXX 详细说明汇编器变体、区域等。

对于 USB,我们发现了类似这样的链。 USB\VID_XXXX&PID_YYYY 有时还会附带序列号。当设备在 Windows 更新后停止工作时, 复制准确的硬件 ID,并将其输入到制造商的搜索引擎或…… 数据库 专门 即使对于较旧的硬件,这也是一种非常准确查找合适驱动程序的方法。

像这样的工具 Snappy 驱动程序安装程序来源 商业控制器管理解决方案通常正是依赖于这些标识符。 将设备驱动程序精确配对还有一些本地搜索引擎能够使用嵌入在 .inf 文件中的 HWID 搜索数百个 .inf 文件,这在你下载了一堆驱动程序但记不清哪个驱动程序对应哪个驱动程序时非常有用。

对于最有条理的人来说,一个很有用的技巧是: 维护一个包含 VEN、DEV、SUBSYS、描述和驱动程序路径等列的电子表格借助 Excel 中的 MID() 等函数,您可以自动从 HWID 字符串中提取这些字段,从长远来看,这可以节省您在处理文档不完善的硬件时进行大量反复试验的时间。

用于处理 USB ID 的辅助工具

虽然这里的重点是你可以用它做什么 PowerShell 和 Windows 内置实用程序了解一些辅助工具很有用——尤其是在你的环境允许安装这些工具的情况下——它们可以简化使用 USB 设备的操作。

微软的 USB 设备查看器 (USBView)

微软免费提供该实用程序。 USB 设备查看器 (USBView)包含在 Windows 驱动程序工具包中。它提供系统中所有 USB 驱动程序和设备的树状视图,并显示 idVendor、idProduct 和其他设备描述符字段 非常清晰地表达。

步骤: 基本步骤是:

  • 安装相应的 Windows 驱动程序工具包并找到 USBView.exe (通常位于调试器路径中,例如 Debuggers\x64)。
  • 运行该程序,然后在左侧的树状图中选择 USB 设备。
  • 请查看右侧面板中的字段。 idVendor 和 idProduct以及描述符的其余部分。

如果您正在开发驱动程序,例如使用 VISA 驾驶员开发向导该数据对于告知驱动程序要根据设备的 VID 和 PID 处理哪些设备至关重要。

在线USB ID数据库

当您手边没有该设备,但知道其名称或部分标识符时,您也可以采用以下方法: 公共 USB ID 数据库在这些类型的网站上,您可以按型号、品牌甚至 VID/PID 片段进行搜索,它们会返回官方值。 供应商 ID 和产品 ID 已注册到该设备。

这在以下情况下尤其有用: 您只有部分硬件 ID,或者 Windows 只提供了通用描述。在搜索兼容的驱动程序或按 ID 应用设备阻止策略之前,您需要确认它对应于哪个 VID/PID。

最终,熟练掌握 USB ID 和其他硬件标识符会让你变成一种“系统侦探”: 您可以追踪导致崩溃的设备、哪个 USB 驱动器连接到哪台计算机以及连接时间,或者驱动程序在更新后停止加载的原因。以 PowerShell 为中心工具,结合设备管理器、WMI、一些专用实用程序,以及必要时的小型 Flask 服务器,您就可以监控和控制环境中的 USB 生态系统,而无需依赖繁琐的第三方解决方案或不可靠的假设。