Partage
  • Partager sur Facebook
  • Partager sur Twitter

utiliser powershell a distance

Sujet résolu
    19 janvier 2023 à 11:38:06

    Bonjour

    Vous l'avez vu dans le titre je voudrais utiliser powershell a distance.

    J'ai essayé d'utiliser les sockets et le subprocess mais je ne peux que executer commandes par commandes

    et non toute l'interface powershell.

    Et aussi un autre probleme c'est que le subprocess utilise cmd.exe et non powershell je suis donc obligé de taper powershell au debut de chaque commande.(ligne 34).

    Avez vous des idées ?

    voici les codes:

    le serveur

    import socket
    import os
    
    SERVER_HOST = "0.0.0.0"
    SERVER_PORT = 5003
    BUFFER_SIZE = 1024 * 128 
    SEPARATOR = "<sep>"
    
    s = socket.socket()
    
    
    s.bind((SERVER_HOST, SERVER_PORT))
    s.listen(5)
    print(f"Listening as {SERVER_HOST}:{SERVER_PORT} ...")
    
    
    client_socket, client_address = s.accept()
    print(f"{client_address[0]}:{client_address[1]} Connected!")
    
    cwd = client_socket.recv(BUFFER_SIZE).decode("utf8")
    print("[+] Current working directory:", cwd)
    
    while True:
        command = input(f"{cwd} $> ")
        if not command.strip():
            continue
        elif command == "clear":
            os.system('cls')
            continue
        elif command.lower() == "exit":
            client_socket.send(command.encode("utf8"))
            break
        else:
            command = f"powershell {command}"
            client_socket.send(command.encode("utf8"))
        
        output = client_socket.recv(BUFFER_SIZE).decode("utf8")
    
        results, cwd = output.split(SEPARATOR)
    
        print(results)

    et le client

    import socket
    import os
    import subprocess
    
    SERVER_HOST = "localhost"
    SERVER_PORT = 5003
    BUFFER_SIZE = 1024 * 128 # 128KB max size of messages, feel free to increase
    SEPARATOR = "<sep>"
    
    s = socket.socket()
    s.connect((SERVER_HOST, SERVER_PORT))
    
    cwd = os.getcwd()
    s.send(cwd.encode("utf8"))
    
    while True:
        command = s.recv(BUFFER_SIZE).decode("utf8")
        splited_command = command.split()
        if command.lower() == "exit":
    
            break
        if splited_command[0].lower() == "cd":
            try:
                os.chdir(' '.join(splited_command[1:]))
            except FileNotFoundError as e:
                output = str(e)
            else:
                output = ""
        else:
            output = subprocess.getoutput(command)
        cwd = os.getcwd()
        message = f"{output}{SEPARATOR}{cwd}"
        s.send(message.encode("utf8"))
    s.close()
    Merci d'avance.



    -
    Edité par Sorio 19 janvier 2023 à 11:38:47

    • Partager sur Facebook
    • Partager sur Twitter
      19 janvier 2023 à 11:59:03

      subprocess devrait fonctionner, voici un exemple ci-dessous,

      import subprocess
      
      # exemple de commande Get-Service | Where-Object {$_.Status -eq 'Running'}
      commands = ["Get-Service", "Where-Object {$_.Status -eq 'Running'}"]
      
      # Enregistrement dans l'ordre des résultats de la commande dans stdout
      result = subprocess.run(["powershell.exe", *commands], capture_output=True)
      
      # Affichage de la sortie
      print(result.stdout.decode())
      



      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        19 janvier 2023 à 12:18:19

        Bonjour et merci de votre rapidité.

        J'ai un petit problème avec votre code.

        j'ai remplacer le contenu de commands par un input et est placé le tout dans une boucle infini.

        Le hic c'est que quand j'utilise une commande comme "ls" il m'affiche "utf-8' codec can't decode byte 0x82 in position 9: invalid start byte"

        Ca viens de la ligne d'affichage de sortie.

        Mais pourquoi m'affiche-t-il ce message alors qu'avec "echo 1" il me renvoi bien "1" ?

        PS je cherche surtout a pouvoir executer TOUTE l'interface powershell avec le prompt et le reste.

        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2023 à 12:44:37

          commands n'est pas une chaîne de caractères mais une liste de chaîne de caractères, faîtes bien la distinction en lisant des tutoriels si besoin.

          notez l'étoile à côté de commands pour récupérer l'ensemble des éléments de la liste

          EDIT: Si vous souhaitez une commande, alors remplacez la liste par une chaîne de caractères (avec input si vous souhaitez) et retirer l'étoile.

          EDIT2 : Pour le problème d'encodage, enregistrer le script avec l'encodage UTF-8 ou remplacer les caractères encodés qui ne passent pas... tester peut-être sans la méthode decode, je ne suis pas sur Windows

          -
          Edité par fred1599 19 janvier 2023 à 13:10:02

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            19 janvier 2023 à 13:51:01

            rebonjour

            Pour commands je l'avais deja modifier en chaine de caractères.

            Le problème quand j'enleve le .decode() c'est qu'il m'affiche dans le cas de "echo 1"

            b'1\r\n'

            alors je ne comprends pas bien le problème.

            PS je le rèpete mais mon objectif est de lancer powershell en entier avec le prompt ...

            • Partager sur Facebook
            • Partager sur Twitter
              19 janvier 2023 à 14:52:46

              Ton problème est lié à l'encodage de ton fichier, tu peux modifier son encodage en "utf-8" par exemple... et comme tu es sur Windows, je ne sais pas comment faire. Peut-être en sauvegardant et la possibilité de spécifier l'encodage en UTF-8, j'entends souvent parler de NotePad ++

              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                19 janvier 2023 à 17:58:54

                Ok, merci ça fonctionne ! :)

                • Partager sur Facebook
                • Partager sur Twitter

                utiliser powershell a distance

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown