J'ai récemment beaucoup joué avec Ansible et, malheureusement, il n'est disponible que sur Linux. Étant un grand gars de Windows, j'ai dû apprendre une tonne sur la façon dont Linux et Python interagissent avec Windows. Mon objectif était d'obtenir ma boîte Ubuntu Linux en utilisant Python pour interroger WMI. Décomposons-le !
Télécharger WMIC sous Linux
La première tâche consistait à interroger une classe WMI commune sur une boîte Windows. Pour ce faire sous Linux, nous devons télécharger et compiler le package WMIC. Pour ce faire, consultez ce GitHub Gist. Pour ceux qui sont trop paresseux pour cliquer sur le lien, voici ce qu'il faut exécuter pour y arriver.
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 vous voyez les propriétés et les valeurs de Win32_OperatingSystem, vous êtes bon !
WMI en Python
L'étape suivante consiste à obtenir un module WMI pour Python. J'ai choisi d'utiliser le wmi-client-wrapper Module Python. Pour l'installer :
> sudo pip install wmi-client-wrapper
Une fois installé, créez un script Python pour le tester. Voici à quoi ressemblait le mien en supposant que Python 2.x est installé. Si vous avez Python 3.x, votre première ligne lira probablement
#!/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'}]
Yay! La sortie est JSON et est assez noueuse à ce stade mais, pour l'instant, je voulais juste que ça marche. J'espère que cela aidera quiconque essaie de faire en sorte que Python interroge WMI sur un ordinateur distant sous Linux !