在Windows 7下从.NET应用程序中查找USB串行端口

Adr*_*Cox 5 .net wmi serial-port windows-7

我有一个应用程序,寻找具有自定义USB描述符的特定FTDI串行端口.我当前的代码使用Code Project中的示例,它搜索下面的MSSerial_PortNameWMI表root\WMI,并从中提取额外的USB信息root\CIMV2\WIN32_PnPEntity.

这在XP下运行良好,但应用程序也必须在Windows 7上的标准用户下运行.在此环境中,访问root\WMI结果为"拒绝访问" ManagementException.

任何人都可以建议一种方法来交叉引用串口的DOS设备名称到USB信息,同时作为标准用户运行?到目前为止,我已经查看了root\CIMV2\WIN32_SerialPort*表格,但它们只包含主板端口.我也考虑过使用SetupAPI,但我还没有找到一个完整且有效的PInvoke模板.

Adr*_*Cox 6

我发现了一个适合我们案例的答案,虽然不是一般的答案.我们的USB转换器都是FTDI,而FTDI提供了一个处理这个问题DLL.我使用DLL的代码如下:

UInt32 count = 0;
FTDI.FT_STATUS status = ftdi.GetNumberOfDevices(ref count);
if (status != FTDI.FT_STATUS.FT_OK)
{
    log.Warn("Unable to access FTDI");
    return ports;
}
FTDI.FT_DEVICE_INFO_NODE[] list = new FTDI.FT_DEVICE_INFO_NODE[count];
status = ftdi.GetDeviceList(list);
if (status != FTDI.FT_STATUS.FT_OK)
{
    log.Warn("Unable to access FTDI");
    return ports;
}
foreach (FTDI.FT_DEVICE_INFO_NODE node in list)
{
    if ((status = ftdi.OpenByLocation(node.LocId)) == FTDI.FT_STATUS.FT_OK)
    {
        try
        {
            string comport;
            ftdi.GetCOMPort(out comport);
            ports.Add(new Port(comport, node.Description, node.SerialNumber));
        }
        finally
        {
            ftdi.Close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)