【问题标题】:How do I discover PCI information from an MSFT_NetAdapter如何从 MSFT_NetAdapter 中发现 PCI 信息
【发布时间】:2020-01-09 17:09:15
【问题描述】:

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

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

我正在使用带有最新 pywin32 和 WMI 1.4.9 的 Python 3.8.1(64 位)作为其方便的包装器,但我希望任何关于如何与 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)

【问题讨论】:

    标签: python windows wmi


    【解决方案1】:

    以下代码 sn-p 可以提供帮助。它将MSFT_NetAdapterMSFT_NetAdapterHardwareInfoSettingData wmi 类的对应实例通过它们的关键属性 配对(请参阅此处提供的链接以及下面的 cmets):

    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\SO\59668995.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 ===
    

    【讨论】:

    • 是的,这正是我所需要的。谢谢!但是,一旦提出问题,您在哪里找到此文档的?我检查了 Microsoft 文档中的 MSFT_NetAdapterHardwareInfoSettingData,但没有提到 InstanceID。我确实尝试查看这是否属于 Win32_NetworkAdapter,但上面没有 InstanceID 属性。有一个名为 GUID 的字符串属性包含相同的内容,因此它们仍然链接在一起。
    • 我发现某些 WMI 类的 Microsoft 文档 也不够充分(甚至被误导),因此我更信任 this WMI reference。无论如何,我更喜欢使用优秀的WMI Explorer 工具来探索 Windows Management Instrumentation 数据库的广阔领域。
    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2012-09-02
    • 1970-01-01
    相关资源
    最近更新 更多