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

WinDev Discussion :

Execution script powershell depuis windev


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 21
    Points
    21
    Par défaut Execution script powershell depuis windev
    Bonjour,

    Je génère un script powershell depuis windev mais il refuse de s'executer.

    J'ai bien passé l’exécution des scripts en unrestricted, tenté de lancer l'exe windev en mode admin et le script marche si je le lance depuis l'explorateur windows.

    Voici mon code:

    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
     
    Procedure executeUpdateLocationPrinter(nomServeurImprimante est une chaîne, nomImprimante est une chaîne, nouvelEmplacement est une chaîne)
     
    idFic est un entier
    cheminFichierPowershell est une chaîne
     
    maCommandePowershell est une chaîne = [
    Get-ExecutionPolicy
    $printer = Get-WmiObject win32_printer -ComputerName %1 | Where-Object {$_.name -eq "%2"}
    $printer.Location = "%3"
    $printer.put()
    Read-Host "Press ENTER"
    ]
     
    QUAND EXCEPTION DANS
     
    maCommandePowershell = ChaîneConstruit(maCommandePowershell,nomServeurImprimante,nomImprimante,nouvelEmplacement)
    cheminFichierPowershell = fRepTemp() + [fSep] + "PS_changePrinterLocation.ps1"
    idFic = fCrée(cheminFichierPowershell) 
     
    SI idFic <> -1 ALORS
    fEcrit(idFic,maCommandePowershell)
    fFerme(idFic)
    LanceAppli("powershell "+cheminFichierPowershell)
    fSupprime(cheminFichierPowershell)
    FIN
     
    FAIRE
    ExceptionPropage()
    FIN
    Si quelqu'un a une idée de comment l’exécuter, ou de comment le traduire en VBScript je suis fortement prenneur.

    Merci d'avance,

    Bon dev

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 056
    Points : 9 396
    Points
    9 396
    Par défaut
    1. Plutôt que fcree(), fecrit() , fferme(), tu peux passer par fsauveTexte() , ce sera plus compact. Mais à priori, cette partie là de ton code est correcte.

    2. J'utilise plutôt DDELance(...) ; Je ne connais pas la différence entre DDELance() et LanceAppli(), mais je n'ai pas de souci particulier avec DDELance().
    Ou sinon , LanceAppliAssociée( repertoire + "PS_changePrinterLocation.PS1" ) , c'est très bien aussi. Ca revient très exactement au double-clic sur un fichier dans l'explorateur Windows.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 21
    Points
    21
    Par défaut
    Merci pour le fSauveTexte, j'avais oublié la nom de la fonction donc je l'avais fais a l'ancienne.

    J'ai testé le lanceAppliAssocié et j'ai le même problème. Il me dis que j'ai pas le droit d’exécuter le script alors que mon système est paramétrés en unrestricted et que si je clique sur le .ps1 ça marche. Pareil avec DDELance, que j'avais déjà tester. Pareil en mettant l'appel dans un .bat. Je désespère ...

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 056
    Points : 9 396
    Points
    9 396
    Par défaut
    ???
    Si tu crées un .BAT , si tu lances ce .BAT en mode console ou en double-cliquant, ça marche, et si tu lances ce .BAT par DDELance() dans Windev, ça ne marche pas, c'est ça que je comprend ?
    Ca me paraît bizarre.
    As tu essayé sur un autre ordi ?
    Ceci étant, je ne sus vraiment pas doué dans toutes ces questions d'administration. Je ne vais pas pouvoir t'aider plus.

    Mais si par hasard des pointures passent par là, ils ne te répondront pas, parce que tu as oublié 2 info qui me paraissent essentielles : Quelle version Windows tu as, et quelle version de Windev.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    attention à la protection d'exécution de scripts powershell.
    Avec le code suivant sous windows 7 windev 16 :
    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
    cheminFichierPowershell est une chaîne
    maCommandePowershell est une chaîne = [
    Get-ExecutionPolicy
    Read-Host "Press ENTER"
    $printer = Get-WmiObject win32_printer -ComputerName %1 | Where-Object {$_.name -eq "%2"}
    $printer.Location = "%3"
    $printer.put()
    Read-Host "Press ENTER"
    ]
     
    QUAND EXCEPTION DANS	
    	cheminFichierPowershell = "f:\temp\"  + "PS_changePrinterLocation.ps1"
    	maCommandePowershell = ChaîneConstruit(maCommandePowershell,"localhost","Fax","NewLocation")
    	SI fSauveTexte(cheminFichierPowershell,maCommandePowershell) ALORS
    		SI LanceAppli("C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe  -noexit  -command " + cheminFichierPowershell,exeActif,exeBloquant) = Faux ALORS
    			Erreur(ErreurInfo())			
    		FIN
    	//	fSupprime(cheminFichierPowershell)
    	FIN
     
    FAIRE
    	ExceptionPropage()
    FIN
    j'obtiens la fenêtre du haut , en double cliquant sur le fichier script l'image du bas :
    Nom : Powershell.png
Affichages : 5151
Taille : 16,8 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    ???
    Si tu crées un .BAT , si tu lances ce .BAT en mode console ou en double-cliquant, ça marche, et si tu lances ce .BAT par DDELance() dans Windev, ça ne marche pas, c'est ça que je comprend ?
    Ca me paraît bizarre.
    As tu essayé sur un autre ordi ?
    Ceci étant, je ne sus vraiment pas doué dans toutes ces questions d'administration. Je ne vais pas pouvoir t'aider plus.

    Mais si par hasard des pointures passent par là, ils ne te répondront pas, parce que tu as oublié 2 info qui me paraissent essentielles : Quelle version Windows tu as, et quelle version de Windev.
    Effectivement c'est exactement ça. Le bat passe en double cliquant dessus mais pas avec DDELance.

    J'utilise Windev 21 et mon pc est en Windows 7 64 Bits.

    Merci pour ton aide en tout cas, je vais essayer sur une autre machine.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    attention à la protection d'exécution de scripts powershell.
    Avec le code suivant sous windows 7 windev 16 :
    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
    cheminFichierPowershell est une chaîne
    maCommandePowershell est une chaîne = [
    Get-ExecutionPolicy
    Read-Host "Press ENTER"
    $printer = Get-WmiObject win32_printer -ComputerName %1 | Where-Object {$_.name -eq "%2"}
    $printer.Location = "%3"
    $printer.put()
    Read-Host "Press ENTER"
    ]
     
    QUAND EXCEPTION DANS	
    	cheminFichierPowershell = "f:\temp\"  + "PS_changePrinterLocation.ps1"
    	maCommandePowershell = ChaîneConstruit(maCommandePowershell,"localhost","Fax","NewLocation")
    	SI fSauveTexte(cheminFichierPowershell,maCommandePowershell) ALORS
    		SI LanceAppli("C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe  -noexit  -command " + cheminFichierPowershell,exeActif,exeBloquant) = Faux ALORS
    			Erreur(ErreurInfo())			
    		FIN
    	//	fSupprime(cheminFichierPowershell)
    	FIN
     
    FAIRE
    	ExceptionPropage()
    FIN
    j'obtiens la fenêtre du haut , en double cliquant sur le fichier script l'image du bas :
    Nom : Powershell.png
Affichages : 5151
Taille : 16,8 Ko

    Ami calmant, J.P
    Justement c'est exactement mon problème. Et même en passant la politique d’exécution des scripts à unrestricted, il ne veux pas lancer le script depuis mon programme. Peut être qu'on ne peut tout simplement pas lancer de powershell depuis un exécutable, ou alors il faudrait réussir à signer le script.

    Merci beaucoup pour vos réponses.

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    bon j'ai trouvé une ruse pour éviter ce problème de script signé. On met toutes les commandes en une seule ligne dans une chaîne en séparant les commandes par un point virgule .
    voici donc la nouvelle procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    PROCEDURE ExecuteUpdateLocationPrinter(nomServeurImprimante est une chaîne, nomImprimante est une chaîne, nouvelEmplacement est une chaîne)
    maCommandePowershell est une chaîne = "$printer = Get-WmiObject win32_printer -ComputerName " + nomServeurImprimante + 
    "| Where-Object {$_.name -eq '" + nomImprimante + "'};" +
    "$printer.Location = '" + nouvelEmplacement + "';"  +
    "$printer.put()"
    Trace(maCommandePowershell)
    QUAND EXCEPTION DANS
    	SI LanceAppli("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe   -command " + maCommandePowershell) = Faux ALORS
    		Erreur(ErreurInfo())	
    	FIN
    FAIRE
    	ExceptionPropage()
    FIN
    Attention j'ai remplacé les guillemets dans les commandes par des apostrophes.
    Voici un exemple d'utilisation pour modifier l'emplacement du Fax de son ordinateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExecuteUpdateLocationPrinter("localhost","Fax","EmplacementNouveau")
    et voici le résultat :
    Nom : powershell_location.png
Affichages : 4099
Taille : 36,3 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Bonjour,
    Un petit code en WinDev issu de la version 7

    Pièce jointe 222611

    Code d'initialisation de la fenêtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Exemple
    COMMANDE="dir c:\"  // le champ Commande console à exécuter :
    ExécuteTraitement(OK,trtClic) // le bouton d'exécution
    Code du bouton OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // RAZ
    RESULTAT=""; Multitâche()
     
    // Exécution de la commande DOS et récupération du résultat
    RESULTAT=LanceCommandeConsole(COMMANDE)
    Procédure LanceCommandeConsole
    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
    31
    32
    FONCTION LanceCommandeConsole(sCommande)
     
    // Appel de commande DOS ou de programme en mode console
    // et récupération du résultat
     
    Sablier(Vrai)
     
    // Suppression du fichier résultat
    fSupprime("Resultat.txt")
    Multitâche()
     
    // Création du .BAT
    IDFic est un entier = fOuvre("test.bat",foCréation+foAjout)
    fEcrit(IDFic,AnsiVersOem(sCommande)+" >Resultat.txt") // le compte rendu sera dirigé vers le fichier  Resultat.txt
    fFerme(IDFic)
    Multitâche()
     
    // Exécution du .BAT
    sRes est une chaîne
    SI Lance("test.bat",Faux,Vrai) ALORS
    	// Récupération du résultat
    	Multitâche()
    	IDFic = fOuvre("Resultat.txt",foLecture)
    	SI PAS IDFic=-1 ALORS
    		sRes=OemVersAnsi(fLit(IDFic,fTaille("Resultat.txt")))
    		fFerme(IDFic)
    	FIN
    FIN
     
    Sablier(Faux)
     
    RENVOYER sRes

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup pour ta réponse @JurassicPork, je m'en vais tester ça de ce pas!

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 21
    Points
    21
    Par défaut
    ça fonctionne bien merci beaucoup pour cette astuce =)

Discussions similaires

  1. Exécuter un script PowerShell depuis PHP
    Par user007 dans le forum Langage
    Réponses: 7
    Dernier message: 07/04/2014, 16h05
  2. Reprendre contrôle Form pendant execution script Powershell
    Par Alienw12 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 21/02/2013, 17h13
  3. Réponses: 4
    Dernier message: 15/09/2010, 16h17
  4. Execution script PHP depuis script shell
    Par TangoZoulou dans le forum Langage
    Réponses: 5
    Dernier message: 18/02/2010, 16h32
  5. Réponses: 1
    Dernier message: 15/02/2009, 07h45

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