2 votes

New-PSSession utilisant uniquement python (pas de module subprocess)

Je voulais savoir s'il était possible d'utiliser New-PsSession y Invoke-Command à un serveur exchange en utilisant uniquement python ? Je fais des tests et je ne veux pas utiliser le système de gestion des données. subprocess mais je voulais plutôt savoir s'il existe des modules python capables de gérer les commandes powershell vers un serveur distant ?

Je l'utilise généralement pour me connecter au serveur d'échange dans powershell :

    $password = ConvertTo-SecureString "SOMEPASSWORD" -AsPlainText -Force
    $Cred = New-Object System.Management.Automation.PSCredential ("ENTEREMAILHERE", $password)
    $ses = New-PSSession -Name "ENTEREMAILHERE" -ConnectionUri https://exchange.intermedia.net/powershell -ConfigurationName Hosting.PowerShell -Credential $Cred -Authentication Basic

Ce que j'ai essayé

J'ai essayé de trouver des modules sur Google et je suis tombé sur deux modules différents, mais ils ne semblent pas fonctionner pour moi.

J'ai essayé d'utiliser pypsrp mais je ne pense pas avoir été capable de le configurer correctement

from httpx import BasicAuth
from pypsrp.powershell import PowerShell, RunspacePool
from pypsrp.wsman import WSMan

wsman = WSMan("https://exchange.intermedia.net/powershell", username="enteremail",
              password="enterpassword",
              auth="basic")

with RunspacePool(wsman) as pool:
    ps = PowerShell(pool)
    ps.add_cmdlet("Get-PSDrive").add_parameter("Name", "C")
    ps.invoke()
    # we will print the first object returned back to us
    print(ps.output[0])

J'obtiens une erreur disant :

requests.exceptions.ConnectionError: HTTPSConnectionPool(host='https', port=443): Max retries exceeded with url: //exchange.intermedia.net/powershell:5986/wsman (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000002449336F610>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))

Je sais que l'url fonctionne car je l'utilise avec powershell tous les jours.

Edit : Après avoir parlé avec @briantist j'ai essayé :

wsman = WSMan("exchange.intermedia.net", username="EMAILHERE",
    password="PASSWORHERE",
    auth="basic",
    port=443,
    path="powershell")

et il semblait que ça allait marcher mais ensuite ça a échoué avec :

Code: 2150858811, Machine: exchange.intermedia.net, Reason: The WS-Management service cannot process the request. The resource URI (http://schemas.microsoft.com/powershell/Microsoft.PowerShell) was not found in  the WS-Management catalog.

Je suppose que c'est parce que le https:// n'était pas là, alors j'ai essayé avec le https:// et il a donné la même erreur que précédemment en disant :

requests.exceptions.ConnectionError:
HTTPSConnectionPool(host='https', port=443): Max retries exceeded
with url: //exchange.intermedia.net:443/powershell (Caused by
NewConnectionError('<urllib3.connection.HTTPSConnection object at
0x0000020759047AC0>: Failed to establish a new  connection: [Errno
11001] getaddrinfo failed'))

2voto

briantist Points 959

Mon expérience avec pysprp se fait principalement par le biais d'Ansible puisqu'il alimente le site psrp plugin de connexion mais j'ai discuté brièvement avec le créateur de la bibliothèque qui m'a suggéré d'utiliser le nom d'hôte et de définir l'attribut path séparément, comme ceci :

WSMan("exchange.intermedia.net", port=443, path="powershell", ...)

Mise à jour : L'OP a confirmé que ça marche avec ce code :

from pypsrp.powershell import PowerShell, RunspacePool 
from pypsrp.wsman import WSMan  

wsman = WSMan("exchange.intermedia.net", username="ENTEREMAIL",               
              password="ENTERPASSWORD",
              auth="basic", port=443, path="powershell")  

with RunspacePool(wsman, configuration_name="Hosting.PowerShell") as pool:
    print("hello")

Points clés :

  • Les points de terminaison basés sur les URI doivent être divisés en nom d'hôte et en chemin d'accès à l'aide de la fonction pypsrp
  • Si vous utilisez un nom de configuration autre que celui par défaut, assurez-vous de le transmettre à la commande RunspacePool également l'objet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X