Di recente ho giocato un po' con Ansible e, sfortunatamente, è disponibile solo su Linux. Essendo un grande ragazzo di Windows, ho dovuto imparare molto su come Linux e Python interagiscono con Windows. Il mio obiettivo era ottenere il mio box Ubuntu Linux usando Python per interrogare WMI. Analizziamolo!
Download di WMIC su Linux
Il primo compito consisteva nell'interrogare una classe WMI comune su una macchina Windows. Per farlo su Linux, dobbiamo scaricare e compilare il pacchetto WMIC. Per fare ciò, dai un'occhiata a questo GitHub Gist. Per chiunque sia troppo pigro per fare clic sul collegamento, ecco cosa eseguire per realizzarlo.
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"
Se vedi le proprietà e i valori di Win32_OperatingSystem sei a posto!
WMI in Python
Il prossimo passo è ottenere un modulo WMI per Python. Ho scelto di utilizzare il wmi-client-wrapper Modulo Python. Per installarlo:
> sudo pip install wmi-client-wrapper
Una volta installato, crea uno script Python per testarlo. Ecco come appariva il mio supponendo che tu abbia installato Python 2.x. Se hai Python 3.x la tua riga superiore probabilmente leggerà
#!/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'}]
Sìì! L'output è JSON ed è piuttosto nodoso a questo punto ma, per ora, volevo solo farlo funzionare. Spero che questo aiuti chiunque cerchi di ottenere Python per interrogare WMI su un computer remoto su Linux!