IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Comment exécuter un script powershell dans delphi ?


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    Points : 54
    Points
    54
    Par défaut Comment exécuter un script powershell dans delphi ?
    Bonjour à vous,

    Je suis responsable informatique dans un établissement scolaire. Depuis le covid nous avons pris l'habitude de travailler avec Office 365 en parallèle aux programmes Aplim qui gère l'ensemble des données de nos élèves (notes, absences, communications avec les élèves, avec les parents, etc).
    En début d'année je dois créer sur Office 365 les adresses mails, les classes et groupes des élèves. J'ai vu d'autre part qu'il était possible d'intervenir sur Office 365 avec Powershell.
    J'aimerai avec delphi et la commande shellexecute, lancer des scripts powershell.
    J'ai trouvé sur internet quelques exemples qui ne sont pas satisfaisants.

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'powershell.exe', '"ping google.com"', nil, SW_SHOWNORMAL);
    fonctionne très bien
    par contre
    pour un script essai.ps1 qui contient la ligne : ping google.com
    l'execution du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'powershell.exe', pchar('essai.ps1'), pchar('C:\essai'), SW_SHOWNORMAL);
    lance la fenètre powershell mais n'exécute pas le script. Il me semble que le soucis se situe au niveau du passage de paramètres, je n'arrive pas à passer le script en paramètre.
    Pourriez-vous m'aider ?
    Merci d'avance

    Je travaille sous delphi 2007 et windows 10 pro.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 753
    Points : 13 338
    Points
    13 338
    Par défaut
    As-tu autorisé l'exécution de script par PowerShell ?

    Pour contrôle (par défaut Restricted) :
    Fixer au minimum RemoteSigned qui autorise les fichiers.ps1 locaux mais requiert des scripts signés si téléchargés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 721
    Points : 5 366
    Points
    5 366
    Par défaut
    Lorsqu'on utilise une fonction, la moindre des choses est de vérifier ce qu'elle fait et ce qu'on doit lui passer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function ShellExecuteW(hWnd:HWND;Operation,FileName,Parameters,Directory: PWideChar;ShowCmd:Integer);
    Tu exécute un script PowerShell, il faut donc passer les paramètres comme tu le ferais en utilisant la commande dans PowerShell.
    Donc quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'powershell.exe', '-File "C:\essai\essai.ps1" -Parameter1 Value1 -Parameter2 Value2', nil, SW_SHOWNORMAL);

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    Points : 54
    Points
    54
    Par défaut
    Bonjour Andnotor et popo et merci d'avoir pris de votre temps pour répondre.

    Andnotor : J'avais bien vu qu'il fallait toucher les droits dans powershell pour lancer un script. A la commande 'Get-ExecutionPolicy' powershell me renvoie bien 'RemoteSigned'

    popo : j'ai essayé votre suggestion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'powershell.exe', '-File "C:\essai\essai.ps1" -Parameter1 Value1 -Parameter2 Value2', nil, SW_SHOWNORMAL);
    j'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'powershell.exe', '-File "C:\essai\essai.ps1", nil, SW_SHOWNORMAL);
    les deux lance bien powershell mais pas le script. Faut-il mettre des paramètres particuliers à la place de '-Parameter1 Value1 -Parameter2 Value2' ?
    Merci d'avance

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 560
    Points : 25 156
    Points
    25 156
    Par défaut
    Si l'extension PS1 est attaché à PowerShell, cela peut se tenter ainsi (en théorie c'est le cas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'C:\essai\essai.ps1', nil, 'C:\essai', SW_SHOWNORMAL);

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 721
    Points : 5 366
    Points
    5 366
    Par défaut
    Citation Envoyé par julesclaude Voir le message
    popo : j'ai essayé votre suggestion
    les deux lance bien powershell mais pas le script. Faut-il mettre des paramètres particuliers à la place de '-Parameter1 Value1 -Parameter2 Value2' ?
    Merci d'avance
    C'est pourtant parfaitement fonctionnel.
    Il est toutefois possible qu'il soit nécessaire de rajouter le ByPass de la politique d'exécution.

    Avec ce PS1 :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    param(
        [string]$FilePath,
        [string]$FileContent
    )
     
    New-Item $FilePath
    Set-Content $FilePath $FileContent

    Et ce code Delphi,
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    program Project3;
     
    {$APPTYPE CONSOLE}
     
    uses
        SysUtils
      , ShellApi // ShellExecute
      , Windows // SW_SHOWNORMAL
      ;
     
    var
      CommandLine: PAnsiChar;
    begin
      CommandLine := '-ExecutionPolicy Bypass'
        + ' -File "C:\Essai\Essai.ps1"'
        + ' -FilePath "C:\Essai\Essai.txt"'
        + ' -FileContent "Ceci est un test"';
     
      ShellExecute(0, 'open', 'powershell.exe', CommandLine, nil, SW_SHOWNORMAL);
    end.

    J'ai bien un fichier qui se créé avec le bon contenu.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    Points : 54
    Points
    54
    Par défaut
    merci ShaileTroll, j'avais essayé ce type de syntaxe mais cela ne fonctionne pas.

    popo : merci beaucoup, ta commande fonctionne, elle lance le script essai.ps1 donc pour moi c'est parfait.
    Par contre j'ai supprimé, dans commandLine, les deux dernières lignes. Si je comprends bien ces lignes, elles auraient du me créer dans le dossier essai, le fichier essai.txt avec pour contenu 'Ceci est un test'. Cela n'a pas marché chez moi.
    mais pour autant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      CommandLine: PAnsiChar;
    begin
      CommandLine := '-ExecutionPolicy Bypass'
        + ' -File "C:\Essai\Essai.ps1"';
      ShellExecute(0, 'open', 'powershell.exe', CommandLine, nil, SW_SHOWNORMAL);
    end;
    fonctionne très bien.
    Je vous félicite tous, vous animez ce forum avec beaucoup d'efficacité et de patience.
    Encore merci, j'attends un peu pour fermer cette discussion.

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 721
    Points : 5 366
    Points
    5 366
    Par défaut
    Citation Envoyé par julesclaude Voir le message
    Si je comprends bien ces lignes, elles auraient du me créer dans le dossier essai, le fichier essai.txt avec pour contenu 'Ceci est un test'. Cela n'a pas marché chez moi.
    .

    Non, tu n'as pas compris.
    Ces lignes sont simplement le reflet du passage de deux paramètres au script PowerShell.
    C'est uniquement parce que mon script PowerShell écrit le fichier avec ces paramètres que le fichier est créé.

    Si j'avais écrit Write-Output $FileContent dans mon script PowerShell à la place des deux dernières lignes, cela aurait simplement affiché le texte dans la console PowerShell.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    Points : 54
    Points
    54
    Par défaut
    Dans mes recherches j'avais trouvé une fonction intéressante que je n'arrivais pas à faire fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    function FileExecute(ahWnd: Cardinal; const aFileName, aParams, aStartDir: string; aShowCmd: Integer; aWait: Boolean): Integer;
    var
      Info: TShellExecuteInfo;
      ExitCode: DWORD;
    begin
      Result := -1;
      FillChar(Info, SizeOf(Info), 0);
      Info.cbSize := SizeOf(TShellExecuteInfo);
      with Info do begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := ahWnd;
        lpFile := PChar(aFileName);
        lpParameters := PChar(aParams);
        lpDirectory := PChar(aStartDir);
        nShow := aShowCmd;
      end;
      if ShellExecuteEx(@Info) then
      begin
        if aWait then
        begin
          repeat
            Sleep(1);
            Application.ProcessMessages;
            GetExitCodeProcess(Info.hProcess, ExitCode);
          until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
          CloseHandle(Info.hProcess);
          Result := ExitCode;
        end;
      end
    end;
    Désolé je ne connais pas l'auteur de cette fonction.

    En mixant la solution de popo et cette fonction, cela marche.
    Quelques détails
    - cette solution n'utilise pas shellexecute mais shellexecuteex qui permet d'avoir un retour d'exécution.
    - elle attend que le script finisse avant de rendre la main au programme appelant
    - elle renvoie éventuellement un code d'erreur

    pour ceux que cela intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    procedure TForm1.Button2Click(Sender: TObject);
    var
      CommandLine: PwideChar;
      Code : Cardinal ;
    begin
      CommandLine := '-ExecutionPolicy Bypass' + ' -File "C:\Essai\Essai.ps1"'  ;
      code := FileExecute(0, 'powershell.exe', CommandLine, '', SW_NORMAL, true);
      if code = 0 then
      begin
        ShowMessage('Succès !');
      end
      else
      begin
        ShowMessage('Raté !' + ' ' + inttostr(code) + SysErrorMessage(Code));
      end;
    end;
    N'hésitez pas à corriger mes explications, si je me trompe.

    popo, je suis désolé mais je n'ai pas compris.

    Non, tu n'as pas compris.
    Ces lignes sont simplement le reflet du passage de deux paramètres au script PowerShell.
    C'est uniquement parce que mon script PowerShell écrit le fichier avec ces paramètres que le fichier est créé.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    Points : 54
    Points
    54
    Par défaut
    Désolé , j'ai oublié les balises !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] Comment ajouter un script powershell dans un notepad (html, php etc).
    Par allybrbs dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 11/01/2019, 13h32
  2. Comment executer un script perl dans un script javascript ?
    Par Hamdi Hedhili dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 01/11/2006, 17h09
  3. Réponses: 5
    Dernier message: 16/03/2006, 00h37
  4. Comment lancer un script perl dans un script perl
    Par kiza dans le forum Langage
    Réponses: 3
    Dernier message: 21/10/2005, 21h02
  5. Réponses: 2
    Dernier message: 19/07/2005, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo