咨询获取运行应用程序设备已连接外设信息的技术方案
嘿,我刚好在做设备信息采集相关的项目时研究过这个,结合你提到的WMI方向,给你整理几个能覆盖你需求的方案,应该能帮到你:
针对不同外设的WMI类推荐及实操示例
显示器信息
要拿到分辨率、制造商、型号、序列号这些信息,Win32_DesktopMonitor和Win32_PnPEntity搭配使用最靠谱:
Win32_DesktopMonitor可以直接获取屏幕分辨率(ScreenWidth/ScreenHeight)、制造商(Manufacturer)、型号(MonitorModel)- 序列号这类唯一标识,得从
Win32_PnPEntity里筛选对应设备的SerialNumber或PNPDeviceID字段,筛选条件可以用WHERE DeviceID LIKE '%DISPLAY%'
快速验证的PowerShell示例:
# 获取显示器基础参数 Get-WmiObject Win32_DesktopMonitor | Select-Object ScreenWidth, ScreenHeight, Manufacturer, MonitorModel # 获取显示器序列号/唯一设备ID Get-WmiObject Win32_PnPEntity | Where-Object {$_.DeviceID -like "*DISPLAY*"} | Select-Object Name, SerialNumber, PNPDeviceID
打印机信息
打印机的需求用Win32_Printer类就能全部覆盖,制造商(Manufacturer)、型号(Model)、序列号(SerialNumber)、唯一标识符(DeviceID/PrinterID)甚至连在线状态都能拿到。
如果是.NET应用,C#代码片段可以这么写:
using System.Management; var printerQuery = new SelectQuery("Win32_Printer"); using var searcher = new ManagementObjectSearcher(printerQuery); foreach (var printer in searcher.Get()) { Console.WriteLine($"制造商: {printer["Manufacturer"]}"); Console.WriteLine($"型号: {printer["Model"]}"); Console.WriteLine($"序列号: {printer["SerialNumber"] ?? "未提供"}"); Console.WriteLine($"唯一ID: {printer["DeviceID"]}"); Console.WriteLine("---"); }
鼠标与键盘信息
这类输入设备的核心查询类还是Win32_PnPEntity,通过设备类GUID精准筛选:
- 鼠标对应的设备类GUID:
{4d36e96f-e325-11ce-bfc1-08002be10318} - 键盘对应的设备类GUID:
{4d36e96b-e325-11ce-bfc1-08002be10318}
筛选后就能提取制造商(Manufacturer)、型号(Name)、序列号(SerialNumber),PNPDeviceID可以作为备选的唯一标识。
PowerShell示例代码:
# 获取已连接鼠标信息 Get-WmiObject Win32_PnPEntity | Where-Object {$_.ClassGuid -eq "{4d36e96f-e325-11ce-bfc1-08002be10318}"} | Select-Object Name, Manufacturer, SerialNumber, PNPDeviceID # 获取已连接键盘信息 Get-WmiObject Win32_PnPEntity | Where-Object {$_.ClassGuid -eq "{4d36e96b-e325-11ce-bfc1-08002be10318}"} | Select-Object Name, Manufacturer, SerialNumber, PNPDeviceID
几个实用提醒
- 部分廉价外设可能不会公开序列号,这时候
PNPDeviceID是更可靠的唯一标识 - WMI查询需要足够权限,用户态应用可能需要申请管理员权限才能拿到完整信息
- 如果你用的是.NET Core/.NET 5+,建议通过NuGet安装
System.Management包来操作,比旧版WMI接口更稳定
内容的提问来源于stack exchange,提问作者harm27
相关产品推荐
相关产品推荐

