原始回答(请参阅下面的更新回答)
您需要查看Win32_PnPEntity WMI类。根据提到的描述,您可以看到,您只需要检查HardwareID
。
以下代码以“快速且不太规范”的方式显示了这一点,我建议创建一个Win32_PnpEntity
类,通过属性公开数据。
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_PnPEntity");
ManagementObjectCollection deviceCollection = searcher.Get();
foreach (var device in deviceCollection)
{
try
{
string caption = (string)device.GetPropertyValue("Caption");
if (caption == null)
continue;
Console.WriteLine(caption);
string[] hardwareIDs = (string[])device.GetPropertyValue("HardwareID");
if (hardwareIDs == null)
continue;
foreach (string hardwareID in hardwareIDs)
{
Console.WriteLine(hardwareID);
}
Console.WriteLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
更新的答案
由于通用问题是如何在C#中读取USB(PnP)设备的WMI数据,因此我编写了一个Win32_PnpEntity
类(去除了注释,因为帖子限制为30000个字符?如果有人想要有注释的版本,请给我留言),它接受ManageementBasObject
并提供该实体的所有数据作为属性。
用法:
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_PnPEntity");
ManagementObjectCollection deviceCollection = searcher.Get();
foreach (var entity in deviceCollection)
{
Win32_PnPEntity device = new Win32_PnPEntity(entity);
Console.WriteLine($"Caption: {device.Caption}");
Console.WriteLine($"Description: {device.Description}");
Console.WriteLine($"Number of hardware IDs: {device.HardwareID.Length}");
foreach (string hardwareID in device.HardwareID)
{
Console.WriteLine(hardwareID);
}
Console.WriteLine();
}
Win32_PnpEntity
类:
public class Win32_PnPEntity
{
public enum AvailabilityEnum
{
Other = 0x01,
Unknown = 0x02,
RunningOrFullPower = 0x03,
Warning = 0x04,
InTest = 0x05,
NotApplicable = 0x06,
PowerOff = 0x07,
OffLine = 0x08,
OffDuty = 0x09,
Degraded = 0x0A,
NotInstalled = 0x0B,
InstallError = 0x0C,
PowerSave_Unknown = 0x0D,
PowerSave_LowPowerMode = 0x0E,
PowerSave_Standyby = 0x0F,
PowerCycle = 0x10,
PowerSave_Warning = 0x11
}
public enum ConfigManagerErrorCodeEnum
{
Unknown = 0xFF,
WorkingProperly = 0x00,
DeviceNotConfiguredError = 0x01,
CannotLoadDriverError = 0x02,
DriverCorruptedError = 0x03,
NotWorkingProperlyError = 0x04,
DriverResourceError = 0x05,
BootConfigurationError = 0x06,
CannotFilterError = 0x07,
DriverLoaderMissingError = 0x08,
DeviceNotWorkingProperlyFirmwareError = 0x09,
DeviceCannotStartError = 0x0A,
DeviceFailedError = 0x0B,
DeviceTooFewResourcesError = 0x0C,
VerifyDeviceResourceError = 0x0D,
DeviceCannotWorkProperlyUnitlRestartError = 0x0E,
DeviceNotWorkingProperlyReenumerationError = 0x0F,
IdentifyResourcesForDeviceError = 0x10,
UnknownResourceTypeError = 0x11,
DeviceDriversMustBeResinstalledError = 0x12,
FailureUsingVxDLoaderError = 0x13,
RegistryMightBeCorruptedError = 0x14,
SystemFailureRemovingDeviceError = 0x15,
DeviceDisabledError = 0x16,
SystemFailureError = 0x17,
DeviceNotPresentError = 0x18,
StillSettingUpTheDeviceError = 0x19,
StillSettingUpTheDeviceError_2 = 0x1A,
InvalidDeviceLogConfigurationError = 0x1B,
DeviceDriversNotInstalledError = 0x1C,
DeviceDisabledDueToFirmwareResourceError = 0x1D,
IRQConflictError = 0x1E,
DeviceNotWorkingProperlyCannotLoadDrivers = 0x1F
}
public enum StatusInfoEnum
{
Other = 0x01,
Unknown = 0x02,
Enabled = 0x03,
Disabled = 0x04,
NotApplicable = 0x05
}
private ManagementBaseObject managementObject;
public Win32_PnPEntity(ManagementBaseObject managementObject)
{
if (managementObject == null)
{
throw new ArgumentNullException(nameof(managementObject));
}
this.managementObject = managementObject;
}
public AvailabilityEnum Availability
{
get
{
try
{
Int16 value = (Int16)this.managementObject.GetPropertyValue("Availability");
if (!Enum.IsDefined(typeof(AvailabilityEnum), value))
{
throw new NotSupportedException($"The value {value} is not supported for conversion to the {nameof(AvailabilityEnum)} enumeration.");
}
return (AvailabilityEnum)value;
}
catch
{
return AvailabilityEnum.Unknown;
}
}
}
public string Caption
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("Caption");
}
catch
{
return "Unknown";
}
}
}
public string ClassGuid
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("ClassGuid");
}
catch
{
return "Unknown";
}
}
}
public string[] CompatibleID
{
get
{
try
{
string[] value = (string[])this.managementObject.GetPropertyValue("ClassGuid");
if (value == null)
return new string[0];
return value;
}
catch
{
return new string[0];
}
}
}
public ConfigManagerErrorCodeEnum ConfigManagerErrorCode
{
get
{
try
{
Int16 value = (Int16)this.managementObject.GetPropertyValue("ConfigManagerErrorCode");
if (!Enum.IsDefined(typeof(ConfigManagerErrorCodeEnum), value))
{
throw new NotSupportedException($"The value {value} is not supported for conversion to the {nameof(ConfigManagerErrorCodeEnum)} enumeration.");
}
return (ConfigManagerErrorCodeEnum)value;
}
catch
{
return ConfigManagerErrorCodeEnum.Unknown;
}
}
}
public bool ConfigManagerUserConfig
{
get
{
try
{
return (bool)this.managementObject.GetPropertyValue("ConfigManagerUserConfig");
}
catch
{
return false;
}
}
}
public string CreationClassName
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("CreationClassName");
}
catch
{
return "Unknown";
}
}
}
public string Description
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("Description");
}
catch
{
return "Unknown";
}
}
}
public string DeviceID
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("DeviceID");
}
catch
{
return "Unknown";
}
}
}
public bool ErrorCleared
{
get
{
try
{
return (bool)this.managementObject.GetPropertyValue("ErrorCleared");
}
catch
{
return false;
}
}
}
public string ErrorDescription
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("ErrorDescription");
}
catch
{
return "Unknown";
}
}
}
public string[] HardwareID
{
get
{
try
{
string[] value = (string[])this.managementObject.GetPropertyValue("HardwareID");
if (value == null)
return new string[0];
return value;
}
catch
{
return new string[0];
}
}
}
public DateTime InstallDate
{
get
{
try
{
DateTime value = (DateTime)this.managementObject.GetPropertyValue("InstallDate");
if (value == null)
return DateTime.MinValue;
return value;
}
catch
{
return DateTime.MinValue;
}
}
}
public UInt32 LastErrorCode
{
get
{
try
{
return (UInt32)this.managementObject.GetPropertyValue("LastErrorCode");
}
catch
{
return 0;
}
}
}
public string Manufacturer
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("Manufacturer");
}
catch
{
return "Unknown";
}
}
}
public string Name
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("Name");
}
catch
{
return "Unknown";
}
}
}
public string PNPClass
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("PNPClass");
}
catch
{
return "Unknown";
}
}
}
public string PNPDeviceID
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("PNPDeviceID");
}
catch
{
return "Unknown";
}
}
}
public UInt16[] PowerManagementCapabilities
{
get
{
try
{
UInt16[] value = (UInt16[])this.managementObject.GetPropertyValue("PowerManagementCapabilities");
if (value == null)
return new UInt16[0];
return value;
}
catch
{
return new UInt16[0];
}
}
}
public bool PowerManagementSupported
{
get
{
try
{
return (bool)this.managementObject.GetPropertyValue("PowerManagementSupported");
}
catch
{
return false;
}
}
}
public bool Present
{
get
{
try
{
return (bool)this.managementObject.GetPropertyValue("Present");
}
catch
{
return false;
}
}
}
public string Service
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("Service");
}
catch
{
return "Unknown";
}
}
}
public string Status
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("Status");
}
catch
{
return "Unknown";
}
}
}
public StatusInfoEnum StatusInfo
{
get
{
try
{
Int16 value = (Int16)this.managementObject.GetPropertyValue("StatusInfo");
if (!Enum.IsDefined(typeof(StatusInfoEnum), value))
{
throw new NotSupportedException($"The value {value} is not supported for conversion to the {nameof(StatusInfoEnum)} enumeration.");
}
return (StatusInfoEnum)value;
}
catch
{
return StatusInfoEnum.NotApplicable;
}
}
}
public string SystemCreationClassName
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("SystemCreationClassName");
}
catch
{
return "Unknown";
}
}
}
public string SystemName
{
get
{
try
{
return (string)this.managementObject.GetPropertyValue("SystemName");
}
catch
{
return "Unknown";
}
}
}
}
Win32_PnPDevice
条目。厂商和产品 ID 可以在 DeviceId 中找到(对于 USB,这将包含字符串VID_xxxxx&PID_yyyyy
,其中 xxxx 和 yyyy 是 4 位十六进制数)。 - Richard