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 confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    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 920
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 920
    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 934
    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 934
    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 confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 048
    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);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 934
    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 934
    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 confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    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 934
    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 934
    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 confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    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 confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 78
    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