Recientemente he estado jugando bastante con Ansible y, desafortunadamente, solo está disponible en Linux. Siendo un gran tipo de Windows, tuve que aprender mucho sobre cómo Linux y Python interactúan con Windows. Mi objetivo era obtener mi caja Ubuntu Linux usando Python para consultar WMI. ¡Vamos a desglosarlo!
Descargando WMIC en Linux
La primera tarea fue consultar una clase WMI común en un cuadro de Windows. Para hacer esto en Linux, necesitamos descargar y compilar el paquete WMIC. Para hacer esto, echa un vistazo a este GitHub Gist. Para cualquiera que sea demasiado perezoso para hacer clic en el enlace, esto es lo que debe ejecutar para que esto suceda.
dpkg -i libwmiclient1_1.3.14-3_amd64.deb
dpkg -i wmi-client_1.3.14-3_amd64.deb
## Test a query to a remote computer
wmic -Utestuser%tstpass //<remote IP> "SELECT * FROM Win32_OperatingSystem"
Si ve las propiedades y los valores de Win32_OperatingSystem, ¡está bien!
WMI en Python
El siguiente paso es obtener un módulo WMI para Python. Elegí usar el wmi-client-wrapper Módulo Python. Para instalar esto:
> sudo pip install wmi-client-wrapper
Una vez instalado, cree un script de Python para probarlo. Así es como se veía el mío asumiendo que tienes Python 2.x instalado. Si tiene Python 3.x, su línea superior probablemente dirá
#!/usr/bin/python3
#!/usr/bin/python
import wmi_client_wrapper as wmi
wmic = wmi.WmiClientWrapper(username="localaccount",password="localpassword",host="<HostNameOrIpAddress>",)
output = wmic.query("SELECT * FROM Win32_Processor")
print(output)
## Save this as <FileName>.py and mark is as executable:
chmod +x <FileName>.py
## Then, we can execute the script to see if it brings back the Win32_Processor class.
[{'L2CacheSize': '0', 'VMMonitorModeExtensions': False, 'ConfigManagerErrorCode': '0', 'VoltageCaps': '0', 'PowerManagementSupported': False, 'LoadPercentage': '1', 'CreationClassName': 'Win32_Processor', 'Version': '', 'Role': 'CPU', 'CpuStatus': '1', 'SecondLevelAddressTranslationExtensions': False, 'Revision': '11527', 'Status': 'OK', 'PNPDeviceID': None, 'L2CacheSpeed': '0', 'AddressWidth': '64', 'ConfigManagerUserConfig': False, 'ErrorCleared': False, 'ProcessorId': '0F8BFBFF000206D7', 'ProcessorType': '3', 'DeviceID': 'CPU0', 'CurrentVoltage': '12', 'CurrentClockSpeed': '2600', 'Manufacturer': 'GenuineIntel', 'Name': 'Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz', 'InstallDate': None, 'Level': '6', 'SocketDesignation': 'None', 'NumberOfCores': '1', 'Caption': 'Intel64 Family 6 Model 45 Stepping 7', 'StatusInfo': '3', 'Architecture': '9', 'UniqueId': None, 'PowerManagementCapabilities': 'NULL', 'OtherFamilyDescription': None, 'Description': 'Intel64 Family 6 Model 45 Stepping 7', 'NumberOfLogicalProcessors': '1', 'Family': '179', 'ErrorDescription': None, 'UpgradeMethod': '6', 'SystemName': 'HOSTNAME', 'LastErrorCode': '0', 'ExtClock': '8000', 'Stepping': None, 'VirtualizationFirmwareEnabled': False, 'MaxClockSpeed': '2600', 'L3CacheSize': '0', 'L3CacheSpeed': '0', 'Availability': '3', 'SystemCreationClassName': 'Win32_ComputerSystem', 'DataWidth': '64'}]
¡Hurra! La salida es JSON y es bastante retorcida en este punto pero, por ahora, solo quería que esto funcionara. ¡Espero que esto ayude a cualquiera que intente hacer que Python consulte WMI en una computadora remota en Linux!