Как узнать информацию о PCI из MSFT_NetAdapter - PullRequest
0 голосов
/ 09 января 2020

Я делаю инвентаризацию оборудования по всем сетевым адаптерам и мне необходимо записать данные, включая скорость, адрес MA C и данные PCI. Я нашел большую часть того, что мне нужно, сканируя через MSFT_NetAdapter и собирая те, которые включают PCI Vendor и идентификаторы устройств, однако информация о расположении шины, по-видимому, отсутствует.

После некоторого поиска в Google я обнаружил MSFT_NetAdapterHardwareInfoSettingData, который имел что мне нужно, но я не уверен, как программно go от одного к другому. У меня есть PnPDeviceID из первого объекта, который, кажется, включает в себя номер экземпляра в суффиксе, но я не уверен, как использовать это для поиска в другом. Насколько я могу судить, для сопоставления можно использовать только поле «Имя», но это звучит как ненадежное решение. Есть ли какой-нибудь способ сделать точный поиск между двумя классами объектов WMI?

Я использую Python 3.8.1 (64-разрядная версия) с последней версией pywin32 и WMI 1.4.9 в качестве удобная обертка для него, но я ожидаю, что будет полезно любое решение, описанное с точки зрения надлежащего взаимодействия с WMI.

Обновление: Ответ от @JosefZ был тем, что я искал. Я взял его пример и сделал его немного более похожим на Pythoni c, поскольку на данный момент мне не нужна полная гибкость 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)

1 Ответ

1 голос
/ 10 января 2020

Следующий фрагмент кода может помочь. Он объединяет соответствующие экземпляры классов MSFT_NetAdapter и 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\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 ===
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...