Python : Interactions avec Windows

De Justine's wiki
Aller à la navigation Aller à la recherche

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'>

  1. !/usr/bin/env python3
  2. coding: utf-8

import winrm from winrm.protocol import Protocol from getpass import getpass

  1. !---------- winrmtest ----------
  2. Description
  3. --------------------------------!


  1. ----------! FUNC
  1. ----------! MAIN
  2. 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 :)