我正在用c#编写一个程序,用于跨多个Windows XP工作站执行硬件审计。
我需要确定哪些PCI设备是通过主板插槽连接的实际卡-而不是也使用PCI总线(内置在主板中)的板载设备。
我可以成功列出使用各种WMI类的所有PCI总线的所有设备,但是没有一个设备提供板载设备与通过插槽连接的设备的任何指示。
只要信息是可靠的,我对如何检索信息或从哪里获取信息(例如Pinvoke、WMI、registry等)并不挑剔。
谢谢!
几个小时后,我想出了一个"相当"可靠的方法。
这个逻辑从根本上假设插槽的PCI设备总线ID是唯一的,并且与所有其他(板载)PCI总线ID分开。到目前为止,我的测试已经证明了这一点;无论如何,这仍然是一个假设。
我的代码相当长,我相信它可以改进,所以我将在伪代码中解释这个过程:
-
确定有多少插槽正在使用(只有当至少有一个插槽正在使用时才继续):
"SELECT SlotDesignation FROM Win32_SystemSlot WHERE CurrentUsage = 4"
-
存储所有属于PCI总线的设备id:
"SELECT DeviceID FROM Win32_Bus where busstype = 5"
-
捕获所有系统和逻辑设备关联:
"SELECT * FROM Win32_DeviceBus"
-
查找所有系统和逻辑设备关联(前置属性),并计算每个deviceID出现的次数
-
您现在可以通过查找与在系统插槽中找到的设备数量出现相同次数的DeviceID来确定插槽PCI设备所在的DeviceID。
-
对于每个包含DeviceID的Win32_DeviceBus结果(在前面的属性中),依赖属性将引用另一个DeviceID用于Win32_PnPEntity类。
-
用新捕获的DeviceID查询Win32_PnPEntity,现在你有了所有的设备信息(或者更确切地说,Win32_PnPEntity提供的所有信息)!
"SELECT * FROM Win32_PnPEntity WHERE DeviceID = '" + DeviceID + "'"
不幸的是,我找不到任何方法来利用Win32_SystemSlot类返回的严重有限的信息(这将使生活变得太容易了!),除了'in use'查询返回的结果计数。
请注意,可能会遇到多个PCI总线,其设备数量与正在使用的插槽数量相同。如果出现这种情况(我还没有遇到过),那么它会建议引发异常,而不是继续和假设您正在查询正确的PCI总线。