我有以下类枚举本地PC上的所有COM端口,只查找和存储具有以给定前缀开头的友好名称的那些。
现在,假设我知道这样的COM端口是复合设备的一部分,并且复合设备也有网络适配器,我如何找到与给定设备关联的网络适配器?我确信必须有一个相对简单的方法来做这个(我认为两个设备都有相同的父节点),但我不确定非互操作方法会是什么...有人可以帮助吗?
这是班级:
/// <summary>
/// A class to enumerate all COM ports through USB.
/// </summary>
public class SerialPortUSB
{
/// <summary>
/// Structure to store a port name and details.
/// </summary>
public struct PortName
{
public string Port;
public string Fullname;
public bool HadPrefix;
};
/// <summary>
/// Function to return all ports with the given prefix.
/// </summary>
/// <param name="prefix"></param>
/// <returns></returns>
static public List<PortName> PortsWithPrefix(string prefix)
{
List<PortName> ports = new List<PortName>();
try
{
// Select all COM ports.
ManagementObjectSearcher searcher = new ManagementObjectSearcher( "root\\CIMV2",
"SELECT * FROM Win32_SerialPort");
// Now iterate results looking for those that start with the prefix.
foreach (ManagementObject item in searcher.Get())
{
string friendlyName = (string)item["Caption"];
if (!friendlyName.StartsWith(prefix))
{
continue;
}
// Construct an item for this.
PortName name = new PortName();
int start = friendlyName.LastIndexOf('(') + 1, end = friendlyName.LastIndexOf(')');
name.HadPrefix = true;
name.Port = friendlyName.Substring(start, end - start);
name.Fullname = friendlyName;
ports.Add(name);
}
}
catch (ManagementException e)
{
// Failed to find any...
}
// Return the list of ports.
return ports;
}
}
答案 0 :(得分:0)
以为我会回复我自己,而不是删除这个问题以防其他人认为答案有用。
事实证明,PNPDeviceID是Win32_SerialPorts和Win32_NetworkAdapters中存在的属性,包含设备唯一的ID,因此可以识别它们。解决方案首先枚举串行端口,然后提取PNPDeviceID的唯一部分,然后找到所有LIKE'%value%'的网络适配器,其中value是PNPDeviceID的一部分。
结果两者的数字相同,即:
串行端口PNPDeviceID = USB \ VID_17DC&amp; PID_0500&amp; MI_02 \ 8&amp; 18F2972&amp; 0&amp; 0002“
和
网络适配器PNPDeviceID = USB \ VID_17DC&amp; PID_0500&amp; MI_00 \ 8&amp; 18F2972&amp; 0&amp; 0000“
,其中公共ID为18F2972。