Как получить информацию об оборудовании удаленной системы с помощью WMI - (Windows Management Instrumentation) из сценария python - PullRequest
0 голосов
/ 15 марта 2020

Цель

Чтобы написать сценарий python, который извлекает некоторую информацию об оборудовании удаленных хостов (только windows), и я использую библиотеку wmi для подключения к оборудованию удаленного хоста информация:

GPU Serial Number
Operating system version
GPU model Name
processor name

Моя среда

language - python 3
connecting remote hosts using wmi library (works)
remote hosts operating system: windows 7 or windows 10

Проблема

Когда я запускаю приведенный ниже код, он выдает 100 классов / функций, у меня даже нет идеи использовать его для удовлетворения моих потребностей (получить информацию об оборудовании)

Код

import wmi
conn = wmi.WMI() 
for classes in conn.classes :
    print(classes)
    ......
    ......
    ......
    Win32_VideoConfiguration
    Win32_LoggedOnUser
    CIM_CompatibleProduct
    Win32_PnPDevicePropertyReal64Array
    Win32_AccountSID
    MSFT_NetCircularDependencyDemand
    CIM_BootOSFromFS
    Msft_WmiProvider_GetObjectAsyncEvent_Post
    Win32_SystemSystemDriver
    CIM_InstIndication
    ......
    ......
    ......

Final Как получить эту информацию об оборудовании удаленных хостов удаленно, используя библиотеку wmi или любым другим возможным способом.

1 Ответ

1 голос
/ 19 марта 2020

Документация wmi предназначена для разработчиков и ИТ-администраторов. Вам нужно знать , где найти подходящие классы и их нужные свойства. Следующий прокомментированный скрипт может помочь.

import wmi
conn = wmi.WMI()         # or # wmi.WMI("some_other_machine")

# Operating system & OS version
for os in conn.Win32_OperatingSystem():
    print( 'OS : ' + os.Caption + ", version " + os.Version )

# Processor name
for pr in conn.Win32_Processor():
    print( 'CPU: ' + pr.Name )

# GPU model Name
# GPU Serial Number - partial solution
for vc in conn.Win32_VideoController():
    print( 'GPU: ' + vc.Name + "\r\n     " + vc.PNPDeviceID )

Обратите внимание, что Серийный номер графического процессора может быть извлечен из PNPDeviceID только если производитель оборудования реализует его:

Глядя на значение PNPDeviceID, разбейте его на "\".

  • Первый элемент это тип шины , Для меня это PCI.
  • Второй раздел описывает карту. Есть код поставщика, номер модели и т. Д. c.
  • . Последний раздел содержит число, разделенное амперсандами. Серийный номер - это второй номер в этом списке, отформатированный в шестнадцатеричном формате.

Дополнительный запрос: данные монитора, такие как серийный номер, метка обслуживания, название модели.

import wmi
conn = wmi.WMI()

# convert uint16[] array to string
def cnvrt( tup ): 
    return ''.join( [chr( x ) if x else '' for x in tup] )

# this is 'universal' DesktopMonitor (no useful details for Generic PnP Monitor?)
for umn in conn.Win32_DesktopMonitor():
    print( 'UMn: Name             {}'.format( umn.Name ) )
    print( 'UMn: PNPDeviceID      {}'.format( umn.PNPDeviceID ) )

# this is 'specific' DesktopMonitor (all useful details?)
con2 =  wmi.WMI(namespace='root/WMI')
for mon in con2.WmiMonitorID():
    print( 'Mon: Active           {}'.format(        mon.Active ) )
    print( 'Mon: InstanceName     {}'.format(        mon.InstanceName ) )
    print( 'Mon: ManufacturerName {}'.format( cnvrt( mon.ManufacturerName ) ) )
    print( 'Mon: ProductCodeID    {}'.format( cnvrt( mon.ProductCodeID    ) ) )
    print( 'Mon: SerialNumberID   {}'.format( cnvrt( mon.SerialNumberID   ) ) )
    print( 'Mon: UserFriendlyName {}'.format( cnvrt( mon.UserFriendlyName ) ) )
...