如何从 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 ===
我正在对所有网络适配器进行硬件清点,需要记录详细信息,包括速度、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 ===