如何从 MSFT_NetAdapter 中发现 PCI 信息

How do I discover PCI information from an MSFT_NetAdapter

我正在对所有网络适配器进行硬件清点,需要记录详细信息,包括速度、MAC 地址和 PCI 详细信息。我发现我需要扫描 MSFT_NetAdapter 并收集包括 PCI 供应商和设备 ID 在内的大部分内容,但是,总线位置信息似乎不存在。

谷歌搜索后,我发现 MSFT_NetAdapterHardwareInfoSettingData 有我需要的东西,但我不确定如何以编程方式从一个转到另一个。我有第一个对象的 PnPDeviceID,它似乎在后缀上包含一个实例编号,但我不确定如何使用它来搜索另一个对象。据我所知,只能使用 Name 字段来匹配它,但这听起来像是一个不可靠的解决方案。有什么方法可以在 WMI 对象的两个 类 之间进行精确搜索吗?

我正在使用 Python 3.8.1(64 位)和最新的 pywin32 和 WMI 1.4.9 作为它的方便包装器,但我希望任何解决方案都描述了如何适当地与 WMI 交互会很有帮助。

更新: @JosefZ 的答案正是我要找的。我采用了他的示例并使它在本质上更 Pythonic 因为我目前不需要 WQL 的全部灵活性:

import wmi

wnamespace = wmi.WMI(namespace="StandardCimv2")

for adapter in wnamespace.MSFT_NetAdapter():
    print('Adapter:', adapter.Name, adapter.InstanceID)
    for proprty in wnamespace.MSFT_NetAdapterHardwareInfoSettingData(InstanceID=adapter.InstanceID):
       print('Result:', proprty.InstanceID, adapter.Name, proprty.Name)

以下代码片段可能会有所帮助。它通过 关键属性 MSFT_NetAdapter and MSFT_NetAdapterHardwareInfoSettingData wmi 类 的相应实例配对(参见此处提供的链接以及下面的评论):

import wmi

wnamespace = wmi.WMI( namespace="StandardCimv2")

# key property = DeviceID
wqlAdapter = "SELECT * FROM MSFT_NetAdapter"
wrxAdapter = wnamespace.query( wqlAdapter)

for adapter in wrxAdapter:
    # key property = InstanceID
    wql = "SELECT * FROM MSFT_NetAdapterHardwareInfoSettingData Where InstanceID='{}'".format(adapter.DeviceID)
    print( "querying adapter: {}".format(adapter.DeviceID)) # debugging 
    wrx = wnamespace.query( wql)
    for proprty in wrx:
        print( '  resulting data:', proprty.InstanceID, adapter.Name, proprty.Name )

print( '=== End Of Script ===')

输出 来自D:\bat\SO668995.py:

querying adapter: {E5531499-8F0E-4966-B3F8-C877A3BE8EF3}
  resulting data: {E5531499-8F0E-4966-B3F8-C877A3BE8EF3} wrdEthernet wrdEthernet
querying adapter: {7D8B1ECC-612C-4C3A-8999-0D91D24103BF}
=== End Of Script ===