一个实用的 WMI 工具和如何查找 USB 转串行适配器
本文旨在介绍一个有用的WMI工具 (WMICodeCreator) 以及如何使用WMI查找USB串行/COM端口适配器。

引言
本文有两个主要目的:
- 介绍和推广一个有用的WMI工具 (
WMICodeCreator
) - 演示一些WMI代码,用于在系统中查找USB-Serial/COM端口适配器。
然而,本文不会涉及WMI的任何基础知识,也不会展示如何使用串行端口。这方面已经有很多有用的文章可供参考。本文也是我首次向The Code Project投稿,我最喜欢的学习创建酷炫新小工具的资源就是这里,所以我想回馈这个伟大的社区。
背景
我有一个项目,通过串行端口(老式的RS-232)控制投影仪的开关。控制投影仪的PC位于一个远离投影仪的服务器机房。它们之间通过一个KVM扩展器连接,该扩展器可以将VGA信号和USB信号通过单根CAT5以太网线传输长达120米。
所以,我必须使用USB转串口适配器与投影仪通信。这些适配器的问题在于它们是“虚拟端口”,会被分配一个随机的COM端口名称,例如COM7。而且它们有时会不稳定,改变端口名称,需要经常维护以定位投影仪。我不能依赖.NET的串行端口来获取名称,因为它也会返回非USB COM端口。由于每台PC只有一个适配器,因此使用WMI来搜索它是有意义的。
Using the Code
WMICodeCreator
我以前使用过Windows Management Instrumentation来查找MAC地址和磁盘驱动器。在WMI的宇宙中定位某个东西对我来说听起来很艰巨。在Google上输入所有关键词并没有给我带来多大帮助,直到有人在MSDN论坛上提到了WMICodeCreator。上面写着“*用这个工具玩转WMI*”。
它可用于搜索命名空间、类、属性、方法、限定符。您可以查询数据库、接收事件或仅浏览命名空间。它甚至在可能的情况下提供描述,“*MaximumBaudRate 属性指示最大...*”。找到您要找的东西后,选择您想要的编程语言(例如C#),它将生成您查询所需的代码。
USB转串口适配器
我过去曾使用过串口适配器。我一直遇到问题。当将它们插入不同的USB端口时,它们的名字会改变,例如从COM5变为COM6。
这是一个典型的Prolific适配器。

我附上了名为WMITestBed
的VS2005 C#项目的源代码。之所以这么命名,是因为我想象未来我需要它来测试更多的WMI代码,而不仅仅是乏味的旧串行端口。它有一个USB串行查找器的有效演示,几乎就是从WMI实用程序中复制粘贴的代码。使用它来开始。在这里随意修改您自己的代码非常容易。
//Below is code pasted from WMICodeCreator
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\WMI",
"SELECT * FROM MSSerial_PortName");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("MSSerial_PortName instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]);
Console.WriteLine("-----------------------------------");
Console.WriteLine("MSSerial_PortName instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("PortName: {0}", queryObj["PortName"]);
//If the serial port's instance name contains USB
//it must be a USB to serial device
if (queryObj["InstanceName"].ToString().Contains("USB"))
{
Console.WriteLine(queryObj["PortName"] + "
is a USB to SERIAL adapter/converter");
}
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
关注点
为了输出代码的结果,我有一个名为DBug
的类。正如其名,我用它来进行调试。我发现IDE中的Console
在调试多个窗体时会变得过于混乱,所以我创建了这个。输出可以重定向到任何窗体,使其更灵活、更易于理解。我重写了Console
和WriteLine
,以便所有输出都转到窗体。如果您遇到任何含糊的编译错误,只需注释掉这个类,然后观察您的输出窗口。
别忘了
如果您创建了自己的项目,请不要忘记添加对System.Managment
的引用,否则它将无法编译。
历史
- 2009年1月7日:初次发布