Python : Interactions avec Windows
Le module Pywinrm
https://pypi.org/project/pywinrm/0.2.2/
Le module Pywinrm est un module pour Python permettant d'interagir avec Windows par l'intermédiaire du protocole WinRM.
Mode Unencrypted
Par défaut, le plus simple semble être le mode unencrypted. Cependant, cela implique d'autoriser ça sur la machine Windows, et puis ce n'est PAS SECURISE
Préparation sur la machine Windows
En admettant que la machine Windows ait déjà WinRM (sinon, voir Ansible et Windows, il peut être nécessaire d'utiliser la commande suivante dans le CMD de la machine :
winrm set winrm/config/service @{AllowUnencrypted="true"}
Utilisation sur Python
<syntaxhighlight lang="python"> s = winrm.Session('windows-host.example.com', auth=('john.smith', 'secret')) r = s.run_cmd('ipconfig', ['/all']) >>> r.status_code 0 >>> r.std_out Windows IP Configuration
Host Name . . . . . . . . . . . . : WINDOWS-HOST Primary Dns Suffix . . . . . . . : Node Type . . . . . . . . . . . . : Hybrid IP Routing Enabled. . . . . . . . : No WINS Proxy Enabled. . . . . . . . : No
... >>> r.std_err </syntaxhighlight>
Avec du chiffrement
Voilà ce que donne la même chose avec du chiffrement ntlm:
<syntaxhighlight lang='python'>
- !/usr/bin/env python3
- coding: utf-8
import winrm from winrm.protocol import Protocol from getpass import getpass
- !---------- winrmtest ----------
- Description
- --------------------------------!
- ----------! FUNC
- ----------! MAIN
- Configuration de l'auth
p = Protocol(
endpoint='https://hotewindows:5986/wsman', transport="ntlm", #basic, plaintext, certificate, ssl, kerberos, ntlm, credssp username=r"domaine.local\adm-ripley", password=getpass(prompt="Pass ? > "), server_cert_validation='ignore' )
shell_id = p.open_shell() command_id = p.run_command(shell_id, 'ipconfig', ['/all']) std_out, std_err, status_code = p.get_command_output(shell_id, command_id) print(std_out, std_err) p.cleanup_command(shell_id, command_id) p.close_shell(shell_id) </syntaxhighlight>
On voit bien la difference. En l'occurence, j'utilise ntlm; mais le paramètre "transport" permet d'autres modes. Sur la machine hôte, une énumération des listeners donne :
winrm enumerate winrm/config/Listener
Listener
Address = *
Transport = HTTP
Port = 5985
Hostname
Enabled = true
URLPrefix = wsman
CertificateThumbprint
ListeningOn = 127.0.0.1, #IPs
Listener
Address = *
Transport = HTTPS
Port = 5986
Hostname = #Un hostname :)
Enabled = true
URLPrefix = wsman
CertificateThumbprint = #Un long thumbprint :)
ListeningOn = 127.0.0.1, #Des IPs :)